微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当参数值包含空格时,Delphi TIdHTTP.Get() API 因 400 Bad Request 失败

如何解决当参数值包含空格时,Delphi TIdHTTP.Get() API 因 400 Bad Request 失败

我正在使用 TIdHTTP.Get() 方法向 API 发送许多参数

我从 string 变量或组件 Text 属性(例如 ComboBox)中提取实际 API 参数的值。一切都很好,直到这些值中的任何一个包含空格。

例如其中一个参数是全名字段(例如:'John Smith'

因为它在名字和姓氏之间包含一个空格,所以一旦我使用 te TIdHTTP.Get() 方法将它发送到 API,它就会抛出一个 400 Bad Request 错误并失败。

如果我从那个/任何特定参数的值中消除空格,它会通过。

我用来测试的代码

httpObject := TIdHTTP.Create;
    
httpObject.HTTPOptions := [hoForceEncodeParams];
httpobject.MaxAuthRetries := 3;
httpObject.ProtocolVersion := pv1_1;
httpObject.Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
httpObject.Request.UserAgent := 'Mozilla/3.0 (compatible;Indy Library)';
httpObject.Request.ContentType := 'application/x-www-form-urlencoded; charset=utf-8';
    
URL := 'url string containing the parameters'; //string variable
httpObject.Get(URL);

API 文档说:

image

我该如何解决这个问题?

使用 Delphi Community Edition(10.3)及其随附的 Indy 组件。

解决方法

您在 URL 中发送参数,而不是在请求正文中,因此设置 Request.ContentType 属性和启用 hoForceEncodeParams 选项完全没有必要,可以省略。

您需要在构建 URL 以发送请求时对参数值进行编码。您可以为此使用 TIdURI 类,例如:

uses
  ...,IdHTTP,IdURI;

URL := 'http://server/shipment?param1='+TIdURI.ParamsEncode(value1)+'&param2='+TIdURI.ParamsEncode(value2)...;
httpObject.Get(URL);
,

您已声明您以Content-Type: application/x-www-form-urlencoded

的身份提交数据

该格式不允许空格。您需要正确编码您提交的内容。

有两种方法可以做到这一点:

与印地:

Encoded := TIdURI.URLEncode(str);

使用 TNetEncoding

Encoded := TNetEncoding.URL.Encode(str);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?