我有一个使用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;