如何解决当参数值包含空格时,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 文档说:
我该如何解决这个问题?
使用 Delphi Community Edition(10.3)及其随附的 Indy 组件。
解决方法
您在 URL 中发送参数,而不是在请求正文中,因此设置 Request.ContentType
属性和启用 hoForceEncodeParams
选项完全没有必要,可以省略。
您需要在构建 URL 以发送请求时对参数值进行编码。您可以为此使用 TIdURI
类,例如:
uses
...,IdHTTP,IdURI;
URL := 'http://server/shipment?param1='+TIdURI.ParamsEncode(value1)+'¶m2='+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 举报,一经查实,本站将立刻删除。