7

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;
4

2 に答える 2

3

TIdHTTPは現時点ではサーバー側のプッシュをサポートしていません (それでも、サーバー側のプッシュを実装できる方法は複数あります。REST サービスはどの方法を使用していますか?)。に切り替えTIdTCPClient、HTTP 要求を手動でフォーマットして送信し、タイマーまたはスレッドを使用して、プッシュされた応答が到着したときに必要に応じて読み取り、解析する必要があります。

于 2013-05-09T20:19:08.407 に答える