2013-05-10 7 views
6

I yield - Ho provato per ore a rompere questo dado ma non riesco a capirlo. Sono troppo nuovo per Ruby (e non ho background Python!) Per tradurre questo e quindi postare i miei dati JSON in un sito che richiede user/pass, e quindi ottenere i dati di risposta.Come posso postare JSON via HTTP in Ruby dopo la conversione da Python?

Questo è il codice Python:

r = requests.post('https://keychain.oneid.com/validate/', json.dumps(data), auth=('username', 'password')) 
r.json() 

dove data è:

{"some" => "data", "fun" => "times"} 

Sto cercando di replicare la funzionalità di questo codice in Ruby per l'uso con un'applicazione Rails, ma tra Capendo come funziona la funzione Python requests.post() e poi scrivendo il codice Ruby per POST e GET, sono completamente perso.

ho cercato Net :: HTTP, ma non mi è chiaro se devo mettere il nome utente/passaggio nel corpo o uso il metodo basic_auth-basic_auth sembra funzionare solo all'interno Net::HTTP.get ... e Net :: HTTP non sembra gestire facilmente JSON, ma ancora una volta, potrei essere completamente fuori a pranzo a questo punto.

Qualsiasi suggerimento o aiuto sarebbe molto apprezzato!

risposta

16

Utilizzare la gemma rest-client o utilizzare semplicemente Net::HTTP.

codice Ruby (versione 1.9.3):

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

uri = URI('https://keychain.oneid.com/validate/') 
req = Net::HTTP::Post.new uri.path 
# ruby 2.0: req = Net::HTTP::Post.new uri 
req.basic_auth 'username', 'password' 
req.body = {:some => 'data', :fun => 'times'}.to_json 

res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http| 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
    http.ssl_version = :SSLv3 
    http.request req 
end 

puts res.body 
# => {"errorcode": -99, "error": "Invalid API credentials. Please verify and try again"} 

json = JSON.parse res.body 
puts json['errorcode'] 
# => -99 
+0

due cose -1) dove vengono inviati i dati JSON? 2) Solo errori con "rrno :: ECONNRESET: connessione ripristinata da peer - SSL_connect" ... qualche idea? – Dan

+0

1) Aggiungi dati JSON: req.body = {: some => 'data',: fun => 'times'}. To_json 2) Forse è un problema OpenSSL: http://stackoverflow.com/questions/11321403/ openssl-trouble-with-ruby-1-9-3 – zhongguoa

+0

Grazie mille, funziona come un fascino. Se qualcun altro colpisce il problema di OpenSSL, questa risorsa è stata la migliore e ha risolto il mio problema: http://railsapps.github.io/openssl-certificate-verify-failed.html – Dan

3

Consiglierei di dare un'occhiata alla gemma RestClient. Rende facile gestire GET/POST, oltre a tutto il resto delle chiamate REST. Ha anche una shell basata su IRB chiamata restclient disponibile dalla riga di comando, rendendo più facile sperimentare le impostazioni di connessione.

Dalla documentazione:

RestClient.post "http://example.com/resource", { 'x' => 1 }.to_json, :content_type => :json, :accept => :json 

Guardando la cosa è possibile vedere somiglianze con il codice Python.

È possibile aggiungere le informazioni di autenticazione per l'hash:

require 'restclient' 
require 'json' 
require 'base64' 

RestClient.post(
    'https://keychain.oneid.com/validate/', 
    { 
    :authentication => 'Basic ' + Base64.encode64(name + ':' + password), 
    'some' => 'data', 
    'fun' => 'times' 
    }.to_json, 
    :content_type => :json, 
    :accept => :json 
) 

In alternativa, è possibile utilizzare il Curb gemma. Curb ha usato libcurl, che è uno strumento standard del settore per la connettività web. La documentazione mostra diversi modi per inviare richieste POST.