我有一个使用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;
答案 0 :(得分:3)
TIdHTTP
此时不支持服务器端推送(即便如此,有多种方法可以实现服务器端推送 - 哪一个是您的REST服务使用?)。您必须切换到TIdTCPClient
,格式化并手动发送HTTP请求,然后使用计时器或线程在到达时根据需要读取和解析推送的响应。
答案 1 :(得分:0)
如果服务器发送multipart/...
响应,Indy 10.6主干中的HTTP客户端(TIdHTTP)现在也支持“服务器推送”:
New TIdHTTP hoNoReadMultipartMIME flag
新的hoNoReadMultipartMIME标志已被添加到 TIdHTTP.HTTPOptions属性。此标志的目的是指定 是否TIdHTTP应读取“multipart / ...”的正文内容 响应,例如“multipart / x-mixed-replace”或 “multipart / byteranges”,进入目标TStream或立即退出 让调用者手动读取内容。
由于有许多不同的方法来实现服务器推送,这个答案对于给定的服务器或多或少都有帮助。