【发布时间】:2013-11-21 16:08:08
【问题描述】:
我作为新员工接手的组件需要帮助,任务是向组件添加新方法。该组件使用 idTCPClient 而不是 idHTTP。原因请参见下面两个问题的回答。
Getting XML from response stream using Indy's IDTCPClient
Getting HTML from response stream using Indy's IDTCPClient
是的 Remy & Jerry,我已经开始重写组件以使用 tidHTTP 而不是 idTCPClient,但我是在自己的空闲时间而不是公司时间做的。所以,我需要今晚完成它。好的,回到这篇文章。
调用下面的get函数,得到如下响应
HTTP/1.0 200 OK
Content-Length: 2069
Date: Wed, 20 Nov 2013 15:00:11 GMT
Content-Type: text/xml; charset=UTF-8
function TMyConnector.GET(aRawHeader: String): String;
begin
if Not Connected then Connected := True;
if Connected then
begin
FRawRequest := 'GET /'+ EncodeUrl(aRawHeader) + ' HTTP/'+HTTPVerText+#13#10+
'Host: '+FHost+#13#10+
'Cookie: UserHPos=IOGLO00003000090000C000BS; '+
'LOSID=qsBiy/wEDCq6tOXFzGbOlTD1lmo5AXdFnCkbzzPn6+qCeheYVyTcumRrjsqh+Hds4Fr2gZDazfDzGN1RA+nnHuQQeBy78ZUgctrZyyy9MnGl2qI/ulkV6EPxAfmmLg/lopRq99f5gAcG/dgtytAJjS+aD5DqtHGrAqjiqgtkwuA=; '+
'LoginHPos=IOGLO00003000090000C000BS; '+
'UIHPos=IOGLO00003000020000500003; '+
'LOSG=61939308-7C83-47ED-B909-2D2D10AD7026; '+
'fControllingBusiness=IOGLO000030000900001000050000200001'+#13#10+
'Connection: Close'+#13#10+
#13#10;
FSock.Socket.Write(FRawRequest);
FRawResponse := FSock.Socket.ReadLn(#13#10#13#10,nil);
Result := FRawResponse;
if ResponseStream = nil then ResponseStream := TMemoryStream.Create
else ResponseStream.SetSize(0);
FSock.Socket.ReadStream(ResponseStream,-1,True);
if Connected and (Not KeepAlive) then Connected := False;
end;
end;
我现在如何从 responseStream 中获取 XML 字符串?
现有的 JSON 方法已经存在
Procedure TMyConnector.GenerateJSON;
begin
if ResponseStream <> nil then
Begin
ResponseJSON_V := TJSONObject.ParseJSONValue(StreamToArray(ResponseStream),0) as TJSONValue;
End;
end;
我想为 XML 创建一个方法,我尝试了以下方法:
Procedure TMyConnector.GenerateXML;
var
S: String;
begin
if ResponseStream <> nil then
// code here to convert ResponseStream to XML
ResponseXML_v:= S;
end;
【问题讨论】:
-
有效吗?有什么问题?
-
将所有接收到的数据保存到TXT文件中。然后在一些十六进制+文本编辑器中打开它并进行调查。另请阅读 Wikipedia 和 HTTP RFC 上的 HTTP 协议描述。返回的数据有望由行组成,由 value==10 个字节(或 13、10 个序列)分隔。最初会有“标题”- 7 位 (0..127) AnsiChar 中的响应描述。会有诸如数据长度、数据字符集/代码页之类的标头以及将该数据转换为 7 位字节的方法(例如 ZIP+base64 或任何其他转换组合)。然后会有一个空行和数据,整个或块。
-
这是您正在与之通信的网络服务吗?那么这不是要走的路......
-
所以你必须解析 HTTP 标头,读取数据到最后,如果它被分块为多个数据包,然后构建转换图并将数据反转换为原生 Delphi 字符串.或者你可以使用任何现成的 HTTP 组件:stackoverflow.com/questions/19653886
-
HTTP 不是一个“流”——它是一个非常复杂的野兽,发展了大约 20 年,并且一次又一次地扩展。因此,您要么使用 HTTP,要么使用普通的非 HTTP 二进制流。在后一种情况下,您必须以一种或另一种方式解决几个问题:哪个字符集用于 string ?字符串有多长?流何时结束或尚未结束?因此,如果您不使用 HTTP 服务器 - 那么您将不得不设计和实施一些其他协议,修复或协商这些问题。