restclient - Ruby envía la solicitud JSON
ruby request post (10)
¿Cómo envío una solicitud JSON en ruby? Tengo un objeto JSON pero no creo que pueda hacer .send
. ¿Tengo que enviar javascript el formulario?
¿O puedo usar la clase net / http en ruby?
Con encabezado - content type = json y body the json object?
Asumiendo que solo quieres convertir rápida y suciamente un hash a json, envía el json a un host remoto para probar una API y analizar la respuesta a ruby. Probablemente sea la manera más rápida sin involucrar gemas adicionales:
JSON.load `curl -H ''Content-Type:application/json'' -H ''Accept:application/json'' -X POST localhost:3000/simple_api -d ''#{message.to_json}''`
Espero que esto sea evidente, pero no lo use en producción. Prueba la joya de Faraday, Mislav da un argumento convincente por qué: http://mislav.uniqpath.com/2011/07/faraday-advanced-http/
La red / http api puede ser difícil de usar.
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
Me gusta este cliente de solicitud http liviano llamado `unirest ''
gem install unirest
uso:
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
Puede enviar una matriz de datos json como esta:
require ''rest_client''
postData = Net::HTTP.post_form(URI.parse(''http://www.xyz.com/api/valueoff''),
{''data''=>jsonData})
Deberías tener la gema rest_client
para esto.
Un simple ejemplo de solicitud POST json para aquellos que lo necesitan incluso más simple de lo que Tom está vinculando a:
require ''net/http''
uri = URI.parse("http://www.example.com/search.json")
response = Net::HTTP.post_form(uri, {"search" => "Berlin"})
ejemplo de la vida real, notifique a Airbrake API sobre la nueva implementación a través de 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)
Notas:
en caso de que realice la autenticación a través del encabezado Authorization, configure header req[''Authorization''] = "Token xxxxxxxxxxxx"
o http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html
HTTParty hace un poco más fácil, creo (y funciona con json anidado, etc., que no parece funcionar en otros ejemplos que he visto).
require ''httparty''
HTTParty.post("http://localhost:3000/api/v1/users", body: {user: {email: ''[email protected]'', password: ''secret''}}).body
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''
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
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