和我之前的其他人一样,我在使用Delphi 2010中的IdHttp(Indy 10.5.5)组件时遇到了麻烦。代码在Delphi 7中运行良好:
var
XMLString : AnsiString;
lService : AnsiString;
ResponseStream: TMemoryStream;
InputStringList : TStringList;
begin
ResponseStream := TMemoryStream.Create;
InputStringList := TStringList.Create;
XMLString :='<?xml version="1.0" encoding="ISO-8859-1"?> '+
'<!DOCTYPE pnet_imessage_send PUBLIC "-//PeopleNet//pnet_imessage_send" "http://open.peoplenetonline.com/dtd/pnet_imessage_send.dtd"> '+
'<pnet_imessage_send> '+
' <cid>username</cid> '+
' <pw>password</pw> '+
' <vehicle_number>tr01</vehicle_number> '+
' <deliver>now</deliver> '+
' <action> '+
' <action_type>reply_with_freeform</action_type> '+
' <urgent_reply>yes</urgent_reply> '+
' </action> '+
' <freeform_message>Test Message Version 2</freeform_message> '+
'</pnet_imessage_send> ';
lService := 'imessage_send';
InputStringList.Values['service'] := lService;
InputStringList.Values['xml'] := XMLString;
try
IdHttp1.Request.Accept := '*/*';
IdHttp1.Request.ContentType := 'text/XML';
IdHTTP1.Post('http://open.peoplenetonline.com/scripts/open.dll', InputStringList, ResponseStream);
...
finally
ResponseStream.Free;
InputStringList.Free;
end;
到目前为止,这与D7代码之间的唯一区别是我已将String类型更改为AnsiString,并添加了HTTP Request属性。
我从服务器返回的响应是'XML无法解析。 Line预计会有空白:1位置:19',我假设XML在这个过程的某个地方出现了乱码,但我无法确定我的错误。
有什么想法吗?
答案 0 :(得分:1)
默认情况下,Posttr()的TStrings版本根据'application / x-www-form-urlencoded'内容类型对输入数据进行编码,但即使您将ContentType设置为'text / xml',实际上并不是自己发布原始XML数据。如果您没有在D7代码中设置ContentType,那么TIdHTTP会将ContentType设置为'application / x-www-form-urlencoded'。您需要在D2010代码中镜像相同的行为,方法是自己设置相同的ContentType值,或者再次删除分配,以便TIdHTTP可以再次为您执行此操作。