2013-02-03 248 views
0

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

的MD5我干脆:

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

这是我记录的文档规范:“[与]包含新信息的JSON正文。”

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

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

任何想法? 谢谢!

回答

0

尝试致电 'to_s' 的方法明确,它应该帮助:

hexDigest = Digest::MD5.hexdigest(request.to_s) 
+0

所以,那运行,但我得到一个身份验证错误。我正在检查它是否是其他内容,但是我担心,因为'req.to_s'会导致'“#'' – Narfanator

+0

另一方面,'get'结果在'“#”',并且仍然有效sooo – Narfanator

+0

不 - 它运行在“GET”上,因为我没有'to_s' GET。你的回答不起作用。 – Narfanator

0

这些线路的等效Ruby代码是:

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

httpMethod.getEntity()将返回定义为请求主体的JSON 。

requestOutputStream.toByteArray()将返回对应于请求主体的字节数组。