使用Indy的IDTCPClient从响应流中获取XML

时间:2013-11-19 03:06:54

标签: xml delphi indy delphi-xe5

这个问题与以下内容有直接关系:

  

Getting HTML from response stream using Indy's IDTCPClient

我只需要一个get函数版本来检索XML

function TMyConnector.GETXML(aRawHeader: String): String;

使用idHTTP组件,我可以执行以下操作

HTTP.Request.ContentType := 'text/xml';

我所追求的文件的标题如下所示:

<?xml version="1.0" encoding="utf-8" ?>

如何使用IDTCPClient组件执行此操作?

2 个答案:

答案 0 :(得分:6)

TIdHTTP.Request.ContentType 不会要求服务器发送XML与HTML。它告诉服务器正在向服务器发送XML / HTML 。非常不同。

要求服务器向您发送XML / HTML,这实际上取决于服务器,而不是客户端。您有几个选择,具体取决于服务器的要求:

  1. 请求仅发送XML的特定URL。请求仅发送HTML的特定URL。等

  2. 请求一个URL,该URL调用服务器端脚本,该脚本允许您传入输入参数,通常(但不总是)在URL中,以指定所需的输出格式。

  3. 在请求中包含Accept标头,用于指定您愿意为给定网址接收的特定格式。服务器必须能够以多种格式表示所请求的数据。

  4. 您对HTTP和TIdHTTP的实际工作方式存在根本性的误解。我强烈建议您使用Wireshark和Fiddler来研究真实的Web浏览器如何发送HTTP请求,然后学习如何在代码中复制它。还要研究RFC 2616.手动实现HTTP并不容易,因此通过拒绝使用预先制作的HTTP库,您可以打开更大的蠕虫病毒,然后您可能已经做好了准备。

答案 1 :(得分:0)

嗯,事实证明这比思想容易。我只是查看GenerateJSON方法并说好,我如何将此方法用于XML。

然后我用MempryStream搜索到String并找到了这个函数

function StreamToString(aStream: TStream): string;
var
  SS: TStringStream;
begin
  if aStream <> nil then
  begin
    SS := TStringStream.Create('');
    try
      SS.CopyFrom(aStream, 0);  // No need to position at 0 nor provide size
      Result := SS.DataString;
    finally
      SS.Free;
    end;
  end else
  begin
    Result := '';
  end;
end;



Procedure TLtLiveConnector.GenerateXML;
begin
if ResponseStream <> nil then
  Begin
   ResponseXML_V := StreamToString(ResponseStream);
  End;
end;