gpt4 book ai didi

Delphi TIdHTTP POST 不编码加号

转载 作者:行者123 更新时间:2023-12-03 18:21:13 35 4
gpt4 key购买 nike

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

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

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

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

其他信息:

我使用的是Delphi 2010。该组件没有任何特殊设置,我想我可能需要设置一些东西? Fiddler 中的 header 内容类型是“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() 对表单数据进行编码,其中空格字符被编码为 %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

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

Request:='hello+world%2Bdog';

关于Delphi TIdHTTP POST 不编码加号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32461631/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com