2

我正在尝试使用 Indy 的 TIdHTTP 组件将数据发送到网站。该代码在 Windows 平台上完美运行,但不幸的是它在 Android 平台上表现异常。当我使用 TIdMultipartFormDataStream 发送 POST 参数时会出现问题。

在 Android 平台上,TIdMultipartFormDataStream 的行为很奇怪,这会发生什么:假设您的 POST 数据是 myparam=myvalue,其中“myparam”是参数名称,“myvalue”是参数值。

参数值更改为 {FIRST CHARACTER REMOVED}yvalue{NULL CHARACTER},因此最终输出将如下所示 yvalue\x00 其中 \x00 是一个空字符。

我可以用 TStringList 替换 TIdMultipartFormDataStream ,我不会遇到这样的问题,但我更喜欢使用 TIdMultipartFormDataStream 因为它使我能够同时上传文件 + 发送 POST 数据。

示例代码:

procedure HTTPPOST;
var
  HTTP: TIdHTTP;
  POSTData: TIdMultipartFormDataStream;
begin
  HTTP := TIdHTTP.Create(nil);
  POSTData := TIdMultipartFormDataStream.Create;

  try
    POSTData.AddFile('myfile','file.txt'); // works
    POSTData.AddFormField('username', 'user1'); // On Android the value gets changed to ser1\x00 where \x00 = Null character

    HTTP.Post('http://www.example.com', POSTData)

  finally
    POSTData.Free;
  end;
end;

注意:代码是使用 Delphi XE5 和 Delphi XE5 Update 1 测试的

4

2 回答 2

1

你所描述的听起来像是一个ZEROBASEDSTRINGS错误,它不应该存在于当前的 SVN 版本中,因为 IndyZEROBASEDSTRINGS在 XE4 中不断遭受大量 ZBS 错误之后,在其所有单元中全局禁用。所以我建议你升级到最新的 SVN 版本。如果您在这样做时遇到问题,请更新您的问题并详细说明原因

于 2013-11-12T06:07:30.140 回答
0

作品..

procedure HTTPPOST;
    var
      HTTP: TIdHTTP;
      POSTData: TIdMultipartFormDataStream;
    begin
      HTTP := TIdHTTP.Create(nil);
      POSTData := TIdMultipartFormDataStream.Create;

      try
        POSTData.AddFile('myfile','file.txt'); // works
        POSTData.AddFormField('username', UTF8Encode('user1'), 'utf-8').ContentTransfer:= '8bit';

        HTTP.Post('http://www.example.com', POSTData)

      finally
        POSTData.Free;
      end;
    end;
于 2014-05-24T23:53:26.967 回答