Delphi TIdHTTP POST不编码加号

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)

Rem*_*eau 5

您正在使用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)

在所有情况下,仅当hoForceEncodeParamsTIdHTTP.HTTPOptions属性中启用了标志(默认情况下为标志)时,才应用上述逻辑。如果无法升级,则必须禁用该hoForceEncodeParams标志并TStringList自己手动编码内容:

Request:='hello+world%2Bdog';
Run Code Online (Sandbox Code Playgroud)