使用Indy'从响应流获取XML;s IDTCPClient

使用Indy'从响应流获取XML;s IDTCPClient,xml,delphi,indy,delphi-xe5,Xml,Delphi,Indy,Delphi Xe5,这个问题与以下方面直接相关: 我只需要一个版本的get函数来检索XML function TMyConnector.GETXML(aRawHeader: String): String; 使用idHTTP组件,我可以执行以下操作 HTTP.Request.ContentType := 'text/xml'; 我要查找的文件头如下所示: <?xml version="1.0" encoding="utf-8" ?> 如何使用IDTCPClient组件实现这一点 TIdHTT

这个问题与以下方面直接相关:

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

function TMyConnector.GETXML(aRawHeader: String): String;
使用idHTTP组件,我可以执行以下操作

HTTP.Request.ContentType := 'text/xml';
我要查找的文件头如下所示:

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


如何使用IDTCPClient组件实现这一点

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

要让服务器向您发送XML/HTML,这实际上取决于服务器,而不是客户机。根据服务器的要求,您有几种选择:

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

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

  • 在请求中包含一个
    Accept
    头,该头指定您愿意为给定URL接收的特定格式。服务器必须能够以多种格式表示请求的数据


  • 您对HTTP和
    TIdHTTP
    的实际工作方式有一个基本的误解。我强烈建议您使用Wireshark和Fiddler来研究真正的web浏览器如何发送HTTP请求,然后学习如何在代码中复制这些请求。同时研究RFC2616。正确地手动实现HTTP并不是一件小事,因此拒绝使用预先制作的HTTP库,就等于打开了一个更大的蠕虫罐,而你可能已经准备好了。

    hmmmm,事实证明这比想象的要容易。我只是简单地看了一下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;
    
    函数StreamToString(aStream:TStream):字符串;
    变量
    SS:TStringStream;
    开始
    如果为零,则
    开始
    SS:=TStringStream.Create(“”);
    尝试
    SS.CopyFrom(aStream,0);//不需要定位在0,也不需要提供大小
    结果:=SS.DataString;
    最后
    SS.免费;
    结束;
    结束其他
    开始
    结果:='';
    结束;
    结束;
    程序TLtLiveConnector.GenerateXML;
    开始
    如果响应为零,则
    开始
    ResponseXML_V:=StreamToString(ResponseStream);
    结束;
    结束;
    
    @LIVESTUFF:Fiddler是一个代理服务器。它可以自动重定向基于WinInet的应用程序(如Internet Explorer)以连接到自身,但其他应用程序(如您的应用程序)需要手动配置以连接到代理
    TIdHTTP
    具有用于该目的的
    ProxyParams
    属性。