2013-02-03 59 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()將返回對應於請求主體的字節數組。