Ale*_*lex 2 delphi http-post delphi-2010 idhttp
我在表单上有一个TIdHTTP组件,并且正在向基于云的服务器发送http POST请求。除1个字段外,其他所有东西都运行良好:带有加号的文本字符串(例如“ hello world + dog”)被保存为“ hello world dog”。
研究此问题后,我意识到URL中的“ +”被视为空格,因此必须对其进行编码。这就是我感到难过的地方;看起来除“ +”外,其余POST请求均由TIdHTTP组件编码。
通过Fiddler查看请求,它以“ hello%20world + dog”的形式出现。如果我手动编码“ +”(hello world%2Bdog),则结果为“ hello%20world%252Bdog”。
我真的不知道我在这里做什么,所以如果有人可以向我指出正确的方向,将不胜感激。
其他信息:
我正在使用Delphi2010。该组件没有任何特殊设置,我想可能需要设置一些内容?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);
Run Code Online (Sandbox Code Playgroud)
您正在使用Indy的过时版本,并且需要升级。
TIdHTTP的webform数据编码器在2010年末进行了几次更改。您的版本似乎早于所有这些更改。
在您的版本,TIdHTTP使用TIdURI.ParamsEncode()内部编码的形式的数据,其中一个空格字符被编码为%20与一个+字符是左未编码的,从而:
hello%20world+dog
Run Code Online (Sandbox Code Playgroud)
在2010年10月,编码器已更新,可以&在调用之前对空格字符进行编码TIdURI.ParamsEncode(),因此:
hello&world+dog
Run Code Online (Sandbox Code Playgroud)
在2010年12月上旬,编码器进行了更新,以+代替对空格字符进行编码,因此:
hello+world+dog
Run Code Online (Sandbox Code Playgroud)
在2010年12月下旬,编码器被完全重写,以遵循W3C的HTML规范application/x-www-form-urlencoded。空格字符编码为+,+字符编码为%2B,因此:
hello+world%2Bdog
Run Code Online (Sandbox Code Playgroud)
在所有情况下,仅当hoForceEncodeParams在TIdHTTP.HTTPOptions属性中启用了标志(默认情况下为标志)时,才应用上述逻辑。如果无法升级,则必须禁用该hoForceEncodeParams标志并TStringList自己手动编码内容:
Request:='hello+world%2Bdog';
Run Code Online (Sandbox Code Playgroud)