我在表单上有一个TIdHTTP组件,我正在向基于云的服务器发送一个http POST请求。除了1个字段外,所有内容都非常出色:带有加号的文本字符串,例如: “你好世界+狗”,被拯救为“你好世界的狗”。
研究这个问题,我意识到URL中的'+'被视为空格,因此必须对其进行编码。这是我难倒的地方;看起来POST请求的其余部分由TIdHTTP组件编码,除了'+'。
通过Fiddler查看请求,它将以'hello%20world + dog'的形式出现。如果我手动编码'+'(hello world%2Bdog),结果是'hello%20world%252Bdog'。
我真的不知道我在这里做什么,所以如果有人能指出我正确的方向,那将是非常感激的。
其他信息:
我正在使用Delphi 2010.该组件没有任何特殊设置,我认为我可能需要设置一些东西? Fiddler中出现的标题内容类型是“application / x-www-form-urlencoded”。
然后,Delphi代码:
Request:='hello world+dog';
URL :='http://............./ExecuteWithErrors';
TSL:=TStringList.Create;
TSL.Add('query='+Request);
Try
begin
IdHTTP1.ConnectTimeout:=5000;
IdHTTP1.ReadTimeout :=5000;
Reply:=IdHTTP1.Post(URL,TSL);
答案 0 :(得分:5)
您使用的是过时的Indy版本,需要升级。
TIdHTTP
的网络表格数据编码器在2010年末已多次更改。您的版本似乎早于所有这些更改。
在您的版本中,TIdHTTP
在内部使用TIdURI.ParamsEncode()
对表单数据进行编码,其中空格字符编码为%20
,而+
字符未编码,因此:
hello%20world+dog
2010年10月,在调用&
之前,编码器已更新为将空格字符编码为TIdURI.ParamsEncode()
,因此:
hello&world+dog
2010年12月初,编码器已更新为将空格字符编码为+
,因此:
hello+world+dog
2010年12月下旬,编码器完全重写以遵循W3C的application/x-www-form-urlencoded
HTML规范。空格字符编码为+
,+
字符编码为%2B
,因此:
hello+world%2Bdog
在所有情况下,只有在hoForceEncodeParams
属性中启用TIdHTTP.HTTPOptions
标志(默认情况下)时才应用上述逻辑。如果无法升级,则必须停用hoForceEncodeParams
标记并自行手动编码TStringList
内容:
Request:='hello+world%2Bdog';