Delphi TIdHTTP POST 不编码加号
Delphi TIdHTTP POST does not encode plus sign
我在表单上有一个 TIdHTTP 组件,我正在向 cloud-based 服务器发送一个 http POST 请求。除了 1 个字段:一个带加号的文本字符串,例如'hello world+dog',正在保存为 'hello world dog'。
研究这个问题,我发现URL中的'+'被认为是space,因此必须对其进行编码。这就是我难住的地方; POST 请求的其余部分似乎由 TIdHTTP 组件编码,“+”除外。
通过 Fiddler 查看请求,它以 'hello%20world+dog' 的形式通过。如果我手动编码 '+' (hello world%2Bdog),结果是 'hello%20world%252Bdog'.
我真的不知道我在这里做什么,所以如果有人能指出我正确的方向,我将不胜感激。
其他信息:
我用的是Delphi 2010。这个组件没有任何特殊设置,我想我可能需要设置一些东西?在Fiddler中经过的headercontent-type是'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);
您使用的 Indy 版本已过时,需要升级。
TIdHTTP
的网络表单数据编码器在 2010 年末进行了多次更改。您的版本似乎早于所有这些更改。
在您的版本中,TIdHTTP
在内部使用 TIdURI.ParamsEncode()
对表单数据进行编码,其中 space 字符编码为 %20
,+
字符未编码,因此:
hello%20world+dog
2010 年 10 月,编码器更新为在调用 TIdURI.ParamsEncode()
之前将 space 字符编码为 &
,因此:
hello&world+dog
2010 年 12 月上旬,编码器更新为将 space 字符编码为 +
,因此:
hello+world+dog
2010 年 12 月下旬,编码器 完全重写 以遵循 W3C 的 HTML application/x-www-form-urlencoded
规范。 space 字符编码为 +
,+
字符编码为 %2B
,因此:
hello+world%2Bdog
在所有情况下,仅当 hoForceEncodeParams
标志在 TIdHTTP.HTTPOptions
属性 中启用(默认情况下)时才应用上述逻辑。如果升级不是一个选项,您将不得不禁用 hoForceEncodeParams
标志并自己手动编码 TStringList
内容:
Request:='hello+world%2Bdog';
我在表单上有一个 TIdHTTP 组件,我正在向 cloud-based 服务器发送一个 http POST 请求。除了 1 个字段:一个带加号的文本字符串,例如'hello world+dog',正在保存为 'hello world dog'。
研究这个问题,我发现URL中的'+'被认为是space,因此必须对其进行编码。这就是我难住的地方; POST 请求的其余部分似乎由 TIdHTTP 组件编码,“+”除外。
通过 Fiddler 查看请求,它以 'hello%20world+dog' 的形式通过。如果我手动编码 '+' (hello world%2Bdog),结果是 'hello%20world%252Bdog'.
我真的不知道我在这里做什么,所以如果有人能指出我正确的方向,我将不胜感激。
其他信息:
我用的是Delphi 2010。这个组件没有任何特殊设置,我想我可能需要设置一些东西?在Fiddler中经过的headercontent-type是'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);
您使用的 Indy 版本已过时,需要升级。
TIdHTTP
的网络表单数据编码器在 2010 年末进行了多次更改。您的版本似乎早于所有这些更改。
在您的版本中,TIdHTTP
在内部使用 TIdURI.ParamsEncode()
对表单数据进行编码,其中 space 字符编码为 %20
,+
字符未编码,因此:
hello%20world+dog
2010 年 10 月,编码器更新为在调用 TIdURI.ParamsEncode()
之前将 space 字符编码为 &
,因此:
hello&world+dog
2010 年 12 月上旬,编码器更新为将 space 字符编码为 +
,因此:
hello+world+dog
2010 年 12 月下旬,编码器 完全重写 以遵循 W3C 的 HTML application/x-www-form-urlencoded
规范。 space 字符编码为 +
,+
字符编码为 %2B
,因此:
hello+world%2Bdog
在所有情况下,仅当 hoForceEncodeParams
标志在 TIdHTTP.HTTPOptions
属性 中启用(默认情况下)时才应用上述逻辑。如果升级不是一个选项,您将不得不禁用 hoForceEncodeParams
标志并自己手动编码 TStringList
内容:
Request:='hello+world%2Bdog';