2016-04-27 53 views
2

與通過Fiddler發送數據和請求相比,我一直在通過Ruby HTTP請求發送JSON數據的主題進行了大量研究。 我的主要目標是找到一種方法來使用Ruby在HTTP請求中發送數據的嵌套散列。使用Ruby的Net/HTTP模塊,我可以發送原始的JSON數據嗎?

在Fiddler中,您可以在請求正文中指定一個JSON並添加標頭「Content-Type:application/json」。

在Ruby中,使用Net/HTTP,如果可能的話,我想做同樣的事情。我有一種預感,那是不可能的,因爲在Ruby中將JSON數據添加到http請求的唯一方法是使用set_form_data,它需要散列中的數據。在大多數情況下這很好,但是這個函數並沒有正確處理嵌套散列(請參閱本文中的comments)。

有什麼建議嗎?

回答

0

閱讀上述tadman的回答後,我在直接將數據添加到更深入研究HTTP請求的主體。最後,我確實做到了:

require 'uri' 
require 'json' 
require 'net/http' 

jsonbody = '{ 
      "id":50071,"name":"qatest123456","pricings":[ 
       {"id":"dsb","name":"DSB","entity_type":"Other","price":6}, 
       {"id":"tokens","name":"Tokens","entity_type":"All","price":500} 
       ] 
      }' 

# Prepare request 
url = server + "/v1/entities" 
uri = URI.parse(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.set_debug_output($stdout) 

request = Net::HTTP::Put.new(uri) 
request.body = jsonbody 
request.set_content_type("application/json") 

# Send request 
response = http.request(request) 

如果你想調試所發出的HTTP請求,使用此代碼,逐字:http.set_debug_output($標準輸出)。這可能是調試通過Ruby發送的HTTP請求的最簡單方法,它非常清楚發生了什麼:)

2

儘管使用類似Faraday往往是很多更愉快的,它仍然是可行的與網:: HTTP庫:

require 'uri' 
require 'json' 
require 'net/http' 

url = URI.parse("http://example.com/endpoint") 

http = Net::HTTP.new(url.host, url.port) 

content = { test: 'content' } 

http.post(
    url.path, 
    JSON.dump(content), 
    'Content-type' => 'application/json', 
    'Accept' => 'text/json, application/json' 
) 
+0

謝謝。你的回答幫助我達成了一些有效的工作。 – Max

相關問題