将 headers 添加到 TRESTClient 时防止 URL-encoding 个值

Prevent URL-encoding of values when adding headers to TRESTClient

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

事实证明我的请求完全匹配工作 C# 库生成的请求,除了 Delphi 的 REST 客户端是 URL-encoding 值添加到请求的 header,因此使精心制作的签名无效。

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

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

签名字符串可能包含斜杠、加号、and/or 等号,但它们不应该出现 URL-encoded。例如当签名字符串的值为...

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

...那么请求应该输出原始 headers 就像...

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-encoding 的值?或者另一种将原始 headers 添加到 TRESTClient 请求的方法?

PS:我已经尝试过 TRESTRequest.Params.AddHeaderTRESTClient.AddParameter 和 TRESTRequestParameterKind.pkHTTPHEADER 作为 Kind 参数。两者都产生了 URL-encoded 个值。

PS2:使用 Delphi RAD Studio 10.3。

您应该在 TRESTRequestParameterOptions 属性 中包含 poDoNotEncode

这可以通过以下方式完成:

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

或使用:

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