Delphi TIdHTTP POST不编码加号

时间:2015-09-08 15:25:04

标签: delphi http-post delphi-2010 idhttp

我在表单上有一个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);

1 个答案:

答案 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';