我正在尝试使用Indy的TIdHTTP组件将数据发送到网站。代码在Windows平台上运行良好,但不幸的是,它在Android平台上的行为很奇怪。当我使用TIdMultipartFormDataStream发送POST参数时会出现问题。
在Android上,TIdMultipartFormDataStream的行为很奇怪,发生了这样的事情:假设POST数据是myparam=myvalue,其中"myparam“是参数名,而"myvalue”是参数值。
参数值被更改为{第一个字符删除}{ null字符},因此最后的输出将类似于这个yvalue\x00,其中\x00是空字符。
我可以用TIdMultipartFormDataStream代替TStringList,我不会面对这样的问题,但是我更喜欢使用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;注意:代码使用DelphiXE5和Delphi XE5更新1进行了测试
发布于 2013-11-12 06:07:30
您所描述的是一个ZEROBASEDSTRINGS错误,它不应该存在于当前的SVN版本中,因为Indy在它的所有单元中都禁用了ZEROBASEDSTRINGS,因为它在XE4中一直存在大量的ZBS错误。所以我建议你升级到最新的SVN版本。如果你在这方面有问题,请更新你的问题,详细解释原因。
发布于 2014-05-24 23:53:26
工作..。
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;https://stackoverflow.com/questions/19914910
复制相似问题