使用 Ruby 的 Net/HTTP 模块,我可以发送原始 JSON 数据吗?
Using Ruby's Net/HTTP module, can I ever send raw JSON data?
与通过 Fiddler 发送数据和请求相比,我一直在对通过 Ruby HTTP 请求发送 JSON 数据这一主题进行大量研究。 我的主要目标是找到一种使用 Ruby.
在 HTTP 请求中发送嵌套数据散列的方法
在Fiddler中,你可以在请求体中指定一个JSON并添加header "Content-Type: application/json".
在Ruby中,使用Net/HTTP,如果可能的话,我想做同样的事情。我有一种预感这是不可能的,因为将 JSON 数据添加到 Ruby 中的 http 请求的唯一方法是使用本文中的 set_form_data, which expects data in a hash. This is fine in most cases, but this function does not properly handle nested hashes (see the comments。
有什么建议吗?
虽然使用 Faraday 这样的东西通常更令人愉快,但它仍然可以使用 Net::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'
)
在阅读了上面 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( $stdout )。这可能是调试通过 Ruby 发送的 HTTP 请求的最简单方法,并且非常清楚发生了什么:)
与通过 Fiddler 发送数据和请求相比,我一直在对通过 Ruby HTTP 请求发送 JSON 数据这一主题进行大量研究。 我的主要目标是找到一种使用 Ruby.
在 HTTP 请求中发送嵌套数据散列的方法在Fiddler中,你可以在请求体中指定一个JSON并添加header "Content-Type: application/json".
在Ruby中,使用Net/HTTP,如果可能的话,我想做同样的事情。我有一种预感这是不可能的,因为将 JSON 数据添加到 Ruby 中的 http 请求的唯一方法是使用本文中的 set_form_data, which expects data in a hash. This is fine in most cases, but this function does not properly handle nested hashes (see the comments。
有什么建议吗?
虽然使用 Faraday 这样的东西通常更令人愉快,但它仍然可以使用 Net::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'
)
在阅读了上面 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( $stdout )。这可能是调试通过 Ruby 发送的 HTTP 请求的最简单方法,并且非常清楚发生了什么:)