我正在尝试使用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测试代码
答案 0 :(得分:1)
您所描述的内容听起来像ZEROBASEDSTRINGS
错误,在当前的SVN版本中不应该存在,因为Indy在XE4中遭受大量ZBS错误后,会在其所有单元中全局禁用ZEROBASEDSTRINGS
。所以我建议你升级到最新的SVN版本。如果您遇到问题,请更新您的问题,并提供解释原因的详细信息
答案 1 :(得分: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;