【问题标题】:Prevent URL-encoding of values when adding headers to TRESTClient向 TR​​ESTClient 添加标头时防止值的 URL 编码
【发布时间】:2021-04-22 05:54:36
【问题描述】:

我正在开发一个公共 API 的 Delphi REST 客户端,该 API 需要将 HMAC256/Base64 签名字符串添加到请求的标头以进行身份​​验证。我花了好几个小时试图弄清楚为什么它不起作用,所以我将来自我的 Delphi 客户端的原始请求与一个正常工作的 C# 库(使用 Wireshark)的请求进行了比较。

事实证明,我的请求与工作中的 C# 库生成的请求完全匹配,除了 Delphi 的 REST 客户端正在对添加到请求标头的值进行 URL 编码,因此使精心设计的签名无效。

这就是我将签名字符串添加到标题的方式:

RESTRequest1.Params.AddHeader('SIGNATURE', FSignature);

签名字符串可能包含斜线、加号和/或等号,而这些斜线、加号和/或等号不应该被 URL 编码。例如当签名字符串的值为...时

FSignature = '8A1BgACL9kB6P/kXuPdm99s05whfkrOUnEziEtU+0OY=';

...那么请求应该输出原始标头,例如...

GET /resource HTTP/1.1
User-Agent: Embarcadero URI Client/1.0
Connection: Keep-Alive
<snip>
SIGNATURE: 8A1BgACL9kB6P/kXuPdm99s05whfkrOUnEziEtU+0OY=
<snip>

...但是 Wireshark 将其显示为正在发送的实际值...

SIGNATURE: 8A1BgACL9kB6P%2FkXuPdm99s05whfkrOUnEziEtU%2B0OY%3D

有没有办法在使用 AddHeader 时防止值的 URL 编码?或者也许是另一种将原始标头添加到 TRESTClient 请求的方法?

PS:我已经尝试了 TRESTRequest.Params.AddHeaderTRESTClient.AddParameter 与 TRESTRequestParameterKind.pkHTTPHEADER 作为 Kind 参数。两者都产生了 URL 编码的值。

PS2:使用 Delphi RAD Studio 10.3。

【问题讨论】:

  • 您是否尝试将参数的Options 属性设置为包含ptDoNotEncode
  • @R.Hoek 是的!这就是缺少的。我找不到将 poDoNotEncode 添加到 TRESTRequest.Params.AddHeader 的方法,但我能够将它作为第三个参数添加到 TRESTClient.AddParameter 中。如果您将其发布在下面,我很乐意将其标记为答案。谢谢!

标签: rest delphi urlencode


【解决方案1】:

您应该在TRESTRequestParameterOptions 属性中包含poDoNotEncode

这可以使用:

RESTClient1.AddParameter('SIGNATURE', FSignature, pkHTTPHEADER, [poDoNotEncode]);

或使用:

RESTClient1.Params.AddHeader('SIGNATURE', FSignature).Options := [poDoNotEncode];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多