0

为了使用第三方 API,我需要将 Net::HTTP::Post 请求编码为 MD5 十六进制摘要,然后将其用作签名的一部分。但是,当我尝试简单时Digest::MD5.hexdigest(req),它会引发“无法转换为字符串错误”,而当我明确时req.to_s,它只会给出 MD5#<Net::HTTP::Post:0x112a0eef8>

我只是:

request = Net::HTTP::Post.new(url.path)
request.body = {
  "key" => "val"
}.to_json
# later...
hexDigest = Digest::MD5.hexdigest(request)

这是文档化的规范,我认为:“[with the] JSON body contains the new information。”

这是他们提供的相关示例 Java 代码:

ByteArrayOutputStream requestOutputStream = new ByteArrayOutputStream();
httpMethod.getEntity().writeTo(requestOutputStream);
DigestUtils.md5Hex(requestOutputStream.toByteArray()).toLowerCase();

有任何想法吗?谢谢!

4

2 回答 2

0

这些行的等效 ruby​​ 代码是:

OpenSSL::Digest::MD5.hexdigest(request.body)

httpMethod.getEntity()将返回定义为请求正文的 json。

requestOutputStream.toByteArray()将返回与请求正文对应的字节数组。

于 2013-04-23T16:14:10.623 回答
0

尝试显式调用“to_s”方法,它应该会有所帮助:

hexDigest = Digest::MD5.hexdigest(request.to_s)
于 2013-02-03T20:20:31.010 回答