2

我在表单上有一个 TIdHTTP 组件,我正在向基于云的服务器发送一个 http POST 请求。除了 1 个字段外,一切都运行良好:带有加号的文本字符串,例如“hello world+dog”,正在保存为“hello world dog”。

研究这个问题,我意识到URL中的“+”被认为是一个空格,所以必须对其进行编码。这就是我难过的地方;看起来 POST 请求的其余部分是由 TIdHTTP 组件编码的,除了“+”。

通过 Fiddler 查看请求,它以“hello%20world+dog”的形式出现。如果我手动编码“+”(hello world%2Bdog),结果是“hello%20world%252Bdog”。

我真的不知道我在这里做什么,所以如果有人能指出我正确的方向,那将不胜感激。

其他信息:

我使用的是 Delphi 2010。该组件没有任何特殊设置,我想我可能需要设置一些东西?Fiddler 中的标头内容类型是“application/x-www-form-urlencoded”。

然后,德尔福代码:

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);
4

1 回答 1

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 的 HTML 规范application/x-www-form-urlencoded。空格字符编码为++字符编码为%2B,因此:

hello+world%2Bdog

hoForceEncodeParams在所有情况下,只有在属性中启用了标志时才应用上述逻辑TIdHTTP.HTTPOptions(默认情况下)。如果升级不是一个选项,您将不得不禁用该hoForceEncodeParams标志并TStringList自己手动编码内容:

Request:='hello+world%2Bdog';
于 2015-09-08T17:01:42.350 回答