Ruby отправляет запрос JSON
Как отправить запрос JSON в ruby? У меня есть объект JSON, но я не думаю, что могу просто сделать .send
. Должен ли я иметь javascript для отправки формы?
Или я могу использовать класс net/http в ruby?
С заголовком - content type = json и body - объект json?
Ответы
Ответ 1
uri = URI('https://myapp.com/api/v1/resource')
req = Net::HTTP::Post.new(uri, 'Content-Type' => 'application/json')
req.body = {param1: 'some value', param2: 'some other value'}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
http.request(req)
end
Ответ 2
require 'net/http'
require 'json'
def create_agent
uri = URI('http://api.nsa.gov:1337/agent')
http = Net::HTTP.new(uri.host, uri.port)
req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
req.body = {name: 'John Doe', role: 'agent'}.to_json
res = http.request(req)
puts "response #{res.body}"
rescue => e
puts "failed #{e}"
end
Ответ 3
HTTParty делает это немного легче, я думаю (и работает с вложенными json и т.д., которые, похоже, не работают в других примерах, которые я видел.
require 'httparty'
HTTParty.post("http://localhost:3000/api/v1/users", body: {user: {email: '[email protected]', password: 'secret'}}).body
Ответ 4
Простой пример запроса json POST для тех, кому он нужен, даже проще, чем то, к чему Tom привязывается:
require 'net/http'
uri = URI.parse("http://www.example.com/search.json")
response = Net::HTTP.post_form(uri, {"search" => "Berlin"})
Ответ 5
Предполагая, что вы просто хотите быстро и грязно преобразовать хэш в json, отправьте json на удаленный хост, чтобы протестировать API и проанализировать ответ на ruby, это, вероятно, самый быстрый способ без привлечения дополнительных камней:
JSON.load 'curl -H 'Content-Type:application/json' -H 'Accept:application/json' -X POST localhost:3000/simple_api -d '#{message.to_json}''
Надеюсь, это само собой разумеется, но не используйте это в производстве. Попробуйте камень Фарадея, Мислав дает веский аргумент: http://mislav.uniqpath.com/2011/07/faraday-advanced-http/
Ответ 6
пример реальной жизни, сообщите API Airbrake о новом развертывании через NetHttps
require 'uri'
require 'net/https'
require 'json'
class MakeHttpsRequest
def call(url, hash_json)
uri = URI.parse(url)
req = Net::HTTP::Post.new(uri.to_s)
req.body = hash_json.to_json
req['Content-Type'] = 'application/json'
# ... set more request headers
response = https(uri).request(req)
response.body
end
private
def https(uri)
Net::HTTP.new(uri.host, uri.port).tap do |http|
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
end
end
end
project_id = 'yyyyyy'
project_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
url = "https://airbrake.io/api/v4/projects/#{project_id}/deploys?key=#{project_key}"
body_hash = {
"environment":"production",
"username":"tomas",
"repository":"https://github.com/equivalent/scrapbook2",
"revision":"live-20160905_0001",
"version":"v2.0"
}
puts MakeHttpsRequest.new.call(url, body_hash)
Заметки:
в случае, если вы выполняете аутентификацию через Authorization header set header req['Authorization'] = "Token xxxxxxxxxxxx"
или http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html
Ответ 7
Мне нравится этот легкий клиент http-запроса, называемый unirest
gem install unirest
использование:
response = Unirest.post "http://httpbin.org/post",
headers:{ "Accept" => "application/json" },
parameters:{ :age => 23, :foo => "bar" }
response.code # Status code
response.headers # Response headers
response.body # Parsed body
response.raw_body # Unparsed body
Ответ 8
Net/http api может быть сложным в использовании.
require "net/http"
uri = URI.parse(uri)
Net::HTTP.new(uri.host, uri.port).start do |client|
request = Net::HTTP::Post.new(uri.path)
request.body = "{}"
request["Content-Type"] = "application/json"
client.request(request)
end
Ответ 9
data = {a: {b: [1, 2]}}.to_json
uri = URI 'https://myapp.com/api/v1/resource'
https = Net::HTTP.new uri.host, uri.port
https.use_ssl = true
https.post2 uri.path, data, 'Content-Type' => 'application/json'
Ответ 10
Вы можете отправить массив данных json следующим образом:
require 'rest_client'
postData = Net::HTTP.post_form(URI.parse('http://www.xyz.com/api/valueoff'),
{'data'=>jsonData})
Для этого у вас должен быть rest_client
драгоценный камень.