2012-06-29 14 views
25

¿Cómo puedo hacer una publicación de Https con un encabezado en Ruby con un json?Ruby https POST con encabezados

que he intentado:

uri = URI.parse("https://...") 
    https = Net::HTTP.new(uri.host,uri.port) 
    req = Net::HTTP::Post.new(uri.path) 
    req['foo'] = bar 
    res = https.request(req) 
puts res.body 
+0

¿Cuál es el error? –

Respuesta

46

El problema era un JSON. Esto resuelve mi problema De todos modos, mi pregunta no era clara, por lo que la recompensa va a Juri

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

@toSend = { 
    "date" => "2012-07-02", 
    "aaaa" => "bbbbb", 
    "cccc" => "dddd" 
}.to_json 

uri = URI.parse("https:/...") 
https = Net::HTTP.new(uri.host,uri.port) 
https.use_ssl = true 
req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/json'}) 
req['foo'] = 'bar' 
req.body = "[ #{@toSend} ]" 
res = https.request(req) 
puts "Response #{res.code} #{res.message}: #{res.body}" 
+1

El código de alguna manera no funcionó para mí. En lugar de @toSend = {}. To_json, tuve que hacer req.set_form_data (@toSend) para enviar correctamente mis datos. Con suerte, esto ayudará a alguien más que se quedó atascado. – Kirk

+0

No necesité usar HTTPS, pero encontré una solución funcional con encabezados personalizados aquí: http://stackoverflow.com/a/36928680/396429 –

+1

debe ser 'initheader: {'Content-Type' => 'application/json '} ' –

31

Probar:

require 'net/http' 
require 'net/https' 

uri = URI.parse("https://...") 
https = Net::HTTP.new(uri.host,uri.port) 
https.use_ssl = true 
req = Net::HTTP::Post.new(uri.path) 
req['foo'] = bar 
res = https.request(req) 
puts res.body 
+2

¿cómo configuro el cuerpo y los encabezados? –

+0

'req.body =" El cuerpo "' –

9

Un ejemplo-seguro de forma predeterminada:

require 'net/http' 
require 'net/https' 

req = Net::HTTP::Post.new("/some/page.json", {'Content-Type' =>'application/json'}) 
req.body = your_post_body_json_or_whatever 
http = Net::HTTP.new('www.example.com', 443) 
http.use_ssl = true 
http.ssl_version = :TLSv1 # ruby >= 2.0 supports :TLSv1_1 and :TLSv1_2. 
# SSLv3 is broken at time of writing (POODLE), and it's old anyway. 

http.verify_mode = OpenSSL::SSL::VERIFY_PEER # please don't use verify_none. 

# if you want to verify a server is from a certain signing authority, 
# (self-signed certs, for example), do this: 
http.ca_file = 'my-signing-authority.crt' 
response = http.start {|http| http.request(req) } 
+0

¿cómo configuro el cuerpo y los encabezados? –

+1

{'Content-Type' => 'application/json'} es el hash que se convierte en los encabezados. "your_post_body_json_or_whatever" es tu cuerpo. –

6

Aquí está una manera más limpia de utilizar Net :: HTTP. Si solo quieres obtener la respuesta y arrojar otros objetos, esto es bastante útil.

require 'net/http' 
require 'json' 

uri = URI("https://example.com/path") 
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http| 
    req = Net::HTTP::Post.new(uri) 
    req['Content-Type'] = 'application/json' 
    # The body needs to be a JSON string, use whatever you know to parse Hash to JSON 
    req.body = {a: 1}.to_json 
    http.request(req) 
end 
# The "res" is what you need, get content from "res.body". It's a JSON string too. 
2

Su trabajo, puede pasar los datos y la cabecera de la siguiente manera:

header = {header part} 
data = {"a"=> "123"} 
uri = URI.parse("https://anyurl.com") 
https = Net::HTTP.new(uri.host,uri.port) 
https.use_ssl = true 
req = Net::HTTP::Post.new(uri.path, header) 
req.body = data.to_json 
res = https.request(req) 

puts "Response #{res.code} #{res.message}: #{res.body}"