2013-05-09 11 views
7

私は安らかな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; 
+0

ヒント:あなたの解決策を回答として追加することができます(それを受け入れる) – mjn

答えて

3

TIdHTTPは、サーバー側は、この時点でプッシュをサポートしていませんます(さらに、サーバー側のプッシュを実装する方法は複数ありますが、どれを使用するのはあなたのRESTサービスですか?)。 TIdTCPClientに切り替えて、手動でHTTPリクエストをフォーマットして送信し、タイマーやスレッドを使用して、プッシュされたレスポンスを必要に応じて読み込んで解析します。

+0

私はあなたがこれを行う方法の簡単な例を私に提供できるとは思わない?私はTidTCPClientを代わりに使用するようにコードを更新しました。そしていくつかの手抜きが何らかの形で返ってきましたが、それはHTMLです。文書ヘッダ情報のように見えます。返されるXMLはありません。カントはこれを行う方法の良い例を見つける。 thnx – MarkZA

+1

WiresharkやFiddlerなどのパケットスニッファを使用して、IEがどのようにURLを要求しているかを確認し、それらの要求値をIndyに複製することをお勧めします。特に '' User-Agent''は、いくつかのサーバがクライアントの種類ごとに異なるコンテンツを送信するため、サーバがプッシュする場合、Webサーバは標準化されていないため、さまざまなタイプのWebブラウザに対して異なるタイプのプッシュを使用する可能性があります誰もがまだ同意しているプッシュのフォーマット。あなたの質問を、スニッファによって捕捉されたプッシュの例で更新した場合は、 'TIdTCPClient'でそれを複製する方法を示すことができます。 –

+0

こんにちは。あなたが探しているものは完全にはわかりません。ブラウザでコマンドを実行し、プッシュ要求に対してwiresharkがキャプチャした内容を確認しました。 HTTPパートは次のとおりです。GET/elite/notifications/stream?resume = 2013-05-06T00:00:00Z HTTP/1.1 ホスト:192.168.10.10 ユーザーエージェント:Mozilla/5.0(Windows NT 6.1; WOW64; rv:20.0)Gecko/20100101 Firefox/20.0 受け入れる:text/html、application/xhtml + xml、application/xml; q = 0.9、*/*; q = 0.8 受け入れ言語:en-US、en; q = 0.5 Accept-Encoding:gzip、deflate 接続:キープアライブ – MarkZA

0

Indy 10のトランクにあるHTTPクライアント(TIdHTTP)。図6は、今も、サーバーがmultipart/...レスポンスを送信する場合、「サーバープッシュ」をサポートしています。

New TIdHTTP hoNoReadMultipartMIME flag

新しいhoNoReadMultipartMIMEフラグが TIdHTTP.HTTPOptionsプロパティに追加されました。このフラグの目的は、TIdHTTPが "multipart/x-mixed-replace"や "multipart/byteranges"のような "multipart/..." レスポンスのボディコンテンツをターゲットTStreamに読み込むべきかどうかを指定することです( )。直ちに を終了し、代わりに発信者に手動でコンテンツを読み取らせることができます。

サーバープッシュを実装するさまざまな方法があるため、この回答は特定のサーバーで多かれ少なかれ役立ちます。

関連する問題