我有一個使用平靜的Web服務的設備,我使用了它的請求/響應功能,我通過HTTP GET向它發送一個命令,並使用適當的XML進行響應。如何通過Indy接收推送通知?
我現在需要使用設備的膿液通知。我已經嘗試了與上述相同的方法,因此我爲TIdHTTP.Get
過程提供了相應的HTTP URL和流以放置響應,但這似乎不起作用。撥打Get
不會回來。這對我來說很有意義,因爲通過推送通知,您將在設備和程序之間打開HTTP通信流,並且此連接將保持開放狀態,直到關閉爲止。
我的問題是,雖然我不知道如何從流獲取XML如果Get
方法不返回。這就好像程序已經掛起。我試圖通過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連接組件需要什麼樣的行動方面的知識(即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;
提示:在Stackoverflow上,您可以添加您的解決方案作爲答案(並接受它) – mjn 2014-03-06 13:11:41