如何通过Indy接收推送通知?
我有一个使用平稳的Web服务的设备,我使用了它的请求/响应功能,我通过HTTP GET发送一个命令,并用相应的XML进行响应。
我现在需要使用设备的脓液通知。 我已经尝试了与上面相同的方法,因此我提供了TIdHTTP.Get
过程,并在其中放置响应的相关HTTP URL和流,但这似乎不起作用。 Get
的电话不会回来。 这对我来说很有意义,因为通过推送通知,您将在设备和程序之间打开HTTP通信流,并且此连接将保持开放状态,直到关闭为止。
我的问题是,虽然我不知道如何从流中Get
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;
任何援助在这个问题将不胜感激。
解
在我的情况下,简单地将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;
TIdHTTP
目前不支持服务器端推送( TIdHTTP
,服务器端推送有多种方式可以实现 - 哪一种是您的REST服务使用的?)。 您将不得不切换到TIdTCPClient
,格式化并手动发送HTTP请求,然后使用计时器或线程在到达时根据需要读取并解析推送的响应。
Indy 10.6中的HTTP客户端(TIdHTTP)现在也支持“服务器推送”,如果服务器发送multipart/...
响应:
新的TIdHTTP hoNoReadMultipartMIME标志
TIdHTTP.HTTPOptions属性中添加了新的hoNoReadMultipartMIME标志。 此标志的用途是指定TIdHTTP是否应将“multipart / x-mixed-replace”或“multipart / byteranges”等“multipart / ...”响应的主体内容读入目标TStream或退出立即让调用者手动读取内容。
由于有很多不同的方法来实现服务器推送,这个答案对给定的服务器可能或多或少有帮助。
链接地址: http://www.djcxy.com/p/13343.html上一篇: How do I receive push notifications with Indy?
下一篇: Iterating over a Django QuerySet while deleting objects in the same QuerySet