私は安らかなWebサービスを使用するデバイスを持っており、リクエスト/応答機能を使用してHTTP GETを介してコマンドを送信し、適切なXMLで応答します。Indyでプッシュ通知を受け取るにはどうすればよいですか?
これで、デバイスの膿の通知を使用する必要があります。私は上記と同じアプローチを試して、TIdHTTP.Get
プロシージャに関連するHTTP URLとストリームを入力して応答を送信しますが、これはうまくいかないようです。 Get
への呼び出しは戻ってこない。これは、プッシュ通知では、デバイスとプログラム間の通信のHTTPストリームを開いており、この接続は閉じられるまでストリーミングのために開いたままである点で私には意味があります。
私の問題は、Get
メソッドが返されない場合、ストリームからXMLを取得する方法がわかりません。あたかもプログラムがハングアップしているかのようです。私はGET経由の通信とスレッドの読み込みをスレッドに行うようにしました。それで、これが自分自身で続行できるようになりました。そして、私のメインアプリケーションは結果として得られたXMLをチェックできますが、これもうまくいきません。
私はこれを複雑にしすぎているのか、単純な解決策があるのか不思議です。単にリクエストを送信して応答を受け取ると、正常に動作します。私は仕事に出られないだけのプッシュストリーミングです。
Internet ExplorerでURLを使用すると、返されたXMLと、ストリームが開いていることを示す「ビジー」ロゴが常に表示されます。
ブラウザFirefox Mozilla 20.0.1でコマンドを実行し、wiresharkがプッシュ要求と応答をキャプチャするのを確認しました。 HTTPの一部を以下に示します。
GET /elite/notifications/stream?resume=2013-05-06T00:00:00Z HTTP/1.1
Host: 192.168.10.10
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
次のように私はDelphiでやろうとしていますリクエストは次のとおりです。
if fEventStream = nil then
fEventStream := TStringStream.Create('');
try
TapItem.fHTTP.Get(TapItem.I2IReaderIP+'/elite/notifications/stream?resume=2013-05-01T00:00:00Z',fEventStream);
TapItem.fEventXML := fEventStream.ReadString(fEventStream.Size);
except
on e:exception do begin
ShowMessage(e.message)
end;
end;
私もTidTCPConnection
fTCPConn.IOHandler.Writeln(TapItem.I2IReaderIP+I2I_PUSH_EVENT+'2013-05-01T00:00:00Z');
While not Terminated do begin
XMLString := XMLString + fTCPConn.IOHandler.Readln;
end;
でどのような援助を試してみましたこの問題は高く評価されます。私の場合は
SOLUTION
単に働いたコールの先頭にGETキーワードを追加します。私は、TCP接続のコンポーネントは、それはあなたがしたいです(つまりなどをPUT GET)、それは私の心を読んカント何のアクションの知識を必要と想定感
fTCPConn.IOHandler.Writeln('GET ' + TapItem.I2IReaderIP+I2I_PUSH_EVENT+'2013-05-01T00:00:00Z');
While not Terminated do begin
XMLString := XMLString + fTCPConn.IOHandler.Readln;
end;
ヒント:あなたの解決策を回答として追加することができます(それを受け入れる) – mjn