Restful Web サービスを使用するデバイスがあり、その要求/応答機能を使用して、HTTP GET 経由でコマンドを送信すると、適切な XML で応答します。
デバイスの膿の通知を使用する必要があります。上記と同じアプローチを試みましたが、これにより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;
この件に関するご支援をいただければ幸いです。
解決
私の場合、呼び出しの先頭に GET キーワードを追加するだけでうまくいきました。TCP 接続コンポーネントには、実行したいアクション (つまり、GET PUT など) の知識が必要であると想定しました。
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;