【问题标题】:IdHttp Post Method Delphi 2010IdHttp Post 方法 Delphi 2010
【发布时间】:2010-05-25 21:17:17
【问题描述】:

和我之前的其他人一样,我在 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 代码之间的唯一区别是我已将字符串类型更改为 AnsiString,并添加了 HTTP 请求属性。

我从服务器返回的响应是“XML 无法解析。 Line:1 Position: 19' 处应有空白,我假设 XML 在此过程中的某个地方出现了乱码,但我不知道哪里出错了。

有什么想法吗?

【问题讨论】:

  • 我刚刚遇到了同样的问题,还试图将 PeopleNet 消息发送到拖拉机。很高兴看到另一个人在做我正在做的事情,即使你比我早几年。

标签: delphi delphi-2010 indy10


【解决方案1】:

默认情况下,Post() 的 TStrings 版本根据“application/x-www-form-urlencoded”内容类型对输入数据进行编码,但您将 ContentType 设置为“text/xml”,即使您实际上并没有自己发布原始 XML 数据。如果您没有在 D7 代码中设置 ContentType,那么 TIdHTTP 会为您将 ContentType 设置为“application/x-www-form-urlencoded”。您需要在 D2010 代码中反映相同的行为,方法是自己设置相同的 ContentType 值,或者再次删除分配,以便 TIdHTTP 可以再次为您执行。

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    相关资源
    最近更新 更多