如何使用Tidhttp使用名为xml的参数发出Get请求?

时间:2013-07-25 10:58:54

标签: delphi http delphi-2010 indy

我已经成功使用Delphi 2010来发出http get请求,但对于一个需要一个名为'xml'的参数的服务,请求失败并出现'HTTP / 1.1 400错误请求'错误。

我注意到调用相同的服务并省略'xml'参数。

我尝试过以下操作但没有成功:

HttpGet('http://localhost/Service/Messaging.svc/SendReports/PDF?xml=<?xml version="1.0"?><email><message><to>email@internal.com</to><from>from@internal.com</from></message></email>&id=42&profile=A1');

...

function TReportingFrame.HttpGet(const url: string): string;
var
  responseStream : TMemoryStream;
  html: string;
  HTTP: TIdHTTP;
begin
  try
      try
        responseStream := TMemoryStream.Create;
        HTTP := TIdHTTP.Create(nil);
        HTTP.OnWork:= HttpWork;
        HTTP.Request.ContentType := 'text/xml; charset=utf-8';
        HTTP.Request.ContentEncoding := 'utf-8';
        HTTP.HTTPOptions := [hoForceEncodeParams];
        HTTP.Request.CharSet := 'utf-8';
        HTTP.Get(url, responseStream);
        SetString(html, PAnsiChar(responseStream.Memory), responseStream.Size);
        result := html;
      except
        on E: Exception do
            Global.LogError(E, 'ProcessHttpRequest');
      end;
    finally
      try
        HTTP.Disconnect;
      except
      end;
    end;
end;

使用参数名称'xml'调用相同的url重命名为其他任何内容,例如'xml2'或'name',其值与上述值相同也适用。我也试过了charset的多种组合,但我认为indy组件正在内部改变它。

修改

服务期望:

[WebGet(UriTemplate = "SendReports/{format=pdf}?report={reportFile}&params={jsonParams}&xml={xmlFile}&profile={profile}&id={id}")]

有没有人有这方面的经验?

由于

1 个答案:

答案 0 :(得分:7)

您需要在通过网址传递参数数据时对其进行编码,TIdHTTP不会为您编码网址,例如:

http.Get(TIdURI.URLEncode('http://localhost/Service/Messaging.svc/SendReports/PDF?xml=<?xml version="1.0"?><email><message><to>email@internal.com</to><from>from@internal.com</from></message></email>&id=42&profile=A1'));

或者:

http.Get('http://localhost/Service/Messaging.svc/SendReports/PDF?xml=' + TIdURI.ParamsEncode('<?xml version="1.0"?><email><message><to>email@internal.com</to><from>from@internal.com</from></message></email>') + '&id=42&profile=A1');