我正在尝试使用Indy的TIdHTTP组件将数据发送到网站。
该代码在Windows平台上可以完美地运行,但是不幸的是,在Android平台上,它的行为异常。当我使用TIdMultipartFormDataStream发送POST参数时,会发生问题。
在Android平台上,TIdMultipartFormDataStream的行为异常,因此会发生以下情况:
假设您的POST数据是myparam = myvalue,其中“ myparam”是参数名称,“ myvalue”是参数值。
参数值已更改为{FIRST CHARACTER} 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进行了测试。
最佳答案
您所描述的听起来像是ZEROBASEDSTRINGS
错误,在当前的SVN版本中不应该存在,因为Indy在XE4中一直遭受许多ZBS错误困扰后,Indy全面禁用了所有单元中的ZEROBASEDSTRINGS
。因此,我建议您升级到最新的SVN版本。如果这样做有问题,请更新您的问题,并详细说明原因