2013-05-09 40 views
7

我有一個使用平靜的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; 
+0

提示:在Stackoverflow上,您可以添加您的解決方案作爲答案(並接受它) – mjn 2014-03-06 13:11:41

回答

3

TIdHTTP不支持服務器端推送此時(即使這樣,服務器端推送可以有多種方式實現 - 哪一種是您的REST服務使用的?)。您將不得不切換到TIdTCPClient,手動格式化併發送HTTP請求,然後使用定時器或線程在到達時根據需要讀取和解析推送的響應。

+0

我不認爲你可以提供一個簡單的例子來說明如何做到這一點?我已經更新了我的代碼,現在改用了TidTCPClient,並且在一些調整之後得到了某種形式的響應,但它是HTML。看起來像文件頭信息。沒有XML被返回。不能找到如何做到這一點的好例子。 thnx – MarkZA 2013-05-10 07:10:28

+1

我建議你使用Wireshark或Fiddler等數據包嗅探器來查看IE如何請求URL,然後在Indy中複製這些請求值。特別是'User-Agent',因爲有些服務器針對不同類型的客戶端發送不同的內容,並且當涉及到服務器推送時,web服務器可能針對不同類型的web瀏覽器使用不同類型的推送,因爲沒有標準化格式推動每個人都同意。如果您通過嗅探器捕獲的推送示例更新您的問題,我可以向您展示如何使用「TIdTCPClient」進行復制。 – 2013-05-10 07:32:08

+0

嗨。不完全確定你在找什麼。我已經通過瀏覽器運行該命令,並查看了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:Language/html,application/xhtml + xml,application/xml; q = 0.9,*/*; q = 0.8 012- = 0.5 Accept-Encoding:gzip,deflate Connection:keep-alive – MarkZA 2013-05-10 08:58:37

0

在印10的軀幹的HTTP客戶端(TIdHTTP)。6現在還支持「服務器推送」,如果服務器發送一個響應multipart/...

New TIdHTTP hoNoReadMultipartMIME flag

新hoNoReadMultipartMIME標誌已經被添加到 TIdHTTP.HTTPOptions財產。此標誌的用途是指定 TIdHTTP是否應將「multipart/...」 響應(例如「multipart/x-mixed-replace」或 「multipart/byteranges」)的正文內容讀入目標TStream或立即退出 並讓調用者手動讀取內容。

由於有很多不同的方法來實現服務器推送,這個答案可能對給定的服務器或多或少有幫助。