我一直在成功使用 Delphi 2010 发送 http get 请求,但对于某个需要名为 'xml' 的参数的服务,请求失败并显示 'HTTP/1.1 400 Bad Request' 错误。
我发现,如果不带上 'xml' 参数调用同一个服务,则可以正常工作。
我尝试了以下方法,但都没有成功:
我发现,如果不带上 '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”,并具有与上述相同的值也可以正常工作。我还尝试了多种字符集组合,但我认为indy组件在内部进行了更改。
编辑
该服务期望:
[WebGet(UriTemplate = "SendReports/{format=pdf}?report={reportFile}¶ms={jsonParams}&xml={xmlFile}&profile={profile}&id={id}")]
有人有这方面的经验吗?
谢谢
TIdHTTP.Get
重载,并将其直接分配给Result
。这将允许您删除当前泄漏的流部分。 - TLama