Delphi的utf8encode是否会包含字符串末尾的\r\n?

4
我需要从我的Delphi应用程序向Web服务发布一些数据。简而言之,我正在做的是:
http := TIdHTTP.Create(nil);
params := TIdMultiPartFormDataStream.Create;
params.AddFormField('param', utf8encode('value'));
http.Post('myurl', params);

在服务器日志中,我得到了这个信息。
{"param"=>"value\r\n"}

我不知道是utf8encode还是TidHTTP.post在字符串末尾包含CRLF。您有什么想法可以防止这种情况发生吗?


要进行验证,请尝试使用手写的简单HTML表单,其中包含一个参数输入字段。或者使用Synapse发送相同的请求,并查看服务器是否仍具有额外的字符。或者使用Fiddler。 - mjn
@mjn 我使用curl进行了测试,服务器没有包含'\r\n',正如Andreas所说,它不是utf8encode,因此只剩下TidHTTPClient...我猜测是它添加了\r\n。不过我不知道为什么。 - Ricardo Acras
我的默认答案现在是: “使用最新版本!” :) - mjn
2个回答

3

TIdHTTPTIdMultipartFormDataStream不会不必要地添加额外的换行符。此外,您手动编码文本的事实告识我您可能在使用较旧版本的Indy。在当前的10.5.8 SVN修订版中,AddFormField()有一个ACharset参数,用于设置TIdFormDataField.CharSet属性,因此TIdMultipartFormDataStream可以在需要时自动为您编码文本,例如:

http := TIdHTTP.Create(nil);   
params := TIdMultiPartFormDataStream.Create;   
params.AddFormField('param1', 'value1', 'utf-8');   
params.AddFormField('param2', 'value2', 'utf-8');   
params.AddFormField('param3', 'value3', 'utf-8');   
http.Post('myurl', params);   

0
进一步调查发现,TidHTTPClient和TIdMultiPartFormDataStream将'\r\n'包含在最后添加的参数中。例如:
http := TIdHTTP.Create(nil);
params := TIdMultiPartFormDataStream.Create;
params.AddFormField('param1', utf8encode('value1'));
params.AddFormField('param2', utf8encode('value2'));
params.AddFormField('param3', utf8encode('value3'));
http.Post('myurl', params);

结果是

{"param1"=>"value1", "param2"=>"value2", "param3"=>"value3\r\n"}

添加一个

params.AddFormField('', '');

在解决了所有参数后,问题得到了解决。虽然不是理想的解决方案,但现在还可以。


1
也许您的Indy版本不是最新的(当前版本为10.5.8) - mjn
似乎是HTTP、SMTP和其他RFC协议工作方式的标准产物。毕竟,你正在发送和接收一块被分成行的文本,并且也许在另一端接收数据的代码依赖于cr+lf的存在。 - Warren P
如果使用curl POST时(使用-d参数)没有发生同样的情况,我猜测这可能是你Indy版本中的一个bug。也许Indy会发送尾随的\r\n,而curl使用\n,或者类似的情况。 - mjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接