当前位置: 首页 > 知识库问答 >
问题:

Delphi TIdHTTP POST不编码加号

融伯寅
2023-03-14

表单上有一个TIdHTTP组件,我正在向基于云的服务器发送超文本传输协议POST请求。一切工作出色,除了1个字段:一个带加号的文本字符串,例如“你好世界狗”,被保存为“你好世界狗”。

在研究这个问题时,我意识到URL中的“”被视为一个空格,因此必须对其进行编码。这就是我被难倒的地方;POST请求的其余部分似乎由TIdHTTP组件编码,但“”除外。

通过Fiddler查看该请求,它将作为“hello world dog”发送。如果我手动编码“”(hello world+dog),结果是“hello world%2Bdog”。

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

其他资料:

我正在使用Delphi 2010。组件没有任何特殊设置,我想我可能需要设置一些东西?Fiddler中的标头内容类型是“应用/x-wow-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个答案

司寇光华
2023-03-14

您使用的是过时的Indy版本,需要升级。

TIdHTTP的webform数据编码器在2010年末进行了几次更改。您的版本似乎早于所有这些更改。

在您的版本中,TIdHTTP在内部使用TIdURI.ParamsEncode()对表单数据进行编码,其中空格字符编码为,而字符未编码,因此:

hello%20world+dog

2010年10月,编码器更新为将空格字符编码为

hello&world+dog

2010年12月初,编码器更新为将空格字符编码为,因此:

hello+world+dog

2010年12月下旬,编码器被完全重写,以遵循W3C的超文本标记语言规范Application/x-wow-form-urlencoded。空格字符编码为,字符编码为+,因此:

hello+world%2Bdog

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

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

 类似资料:
  • 我正在使用spring boot,spring安全,OAuth2和JWT来验证我的应用程序,但我一直得到这个令人讨厌的错误,我不知道什么是错误的。我的类: : : 除: 我的实体模型类是: 实体: 实体: 我在数据库中的密码是正确加密的spring安全BCrypt,它的数据类型是varchar(255),大于60。

  • 问题内容: 我通过AJAX将表单字段的内容发布到PHP脚本,并使用JavaScript来发布。问题在于,任何加号都被删除并被空格代替。如何安全地“编码”加号,然后在PHP端适当地“解码”它? 问题答案: 在JS和PHP中使用时,您应该收到正确的值。 注意:当您访问,或在PHP中,要检索已经被解码值。 例: 在您的JS中: 在您的服务器上: 只有原始的HTTP请求包含url编码的数据。 对于GET请

  • 本文向大家介绍shiro编码和加密代码详解,包括了shiro编码和加密代码详解的使用技巧和注意事项,需要的朋友参考一下 涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。 编码/解码  Shiro提供了base64和16进制字符串编码/解码的API支持,方便一些编码解码操作。Shi

  • 我有这样一个csv文件 我在读书

  • 代码不编译。我不明白错误是什么,请帮忙) 错误文本:g-Wall-c“main.cpp”(/media/ad/4GB-NTFS/prog/laba2)main。cpp:In函数“int main()”:main。cpp:46:12:错误:调用“Record::Record()”记录r1;^主要的cpp:12:1:注意:候选者:Record::Record(std::\u cxx11::string