2013-05-10 5 views
6

मैं उपज करता हूं - मैंने इस अखरोट को तोड़ने के लिए घंटों तक कोशिश की है लेकिन इसे समझ नहीं सकता है। मैं रूबी के लिए बहुत नया हूं (और इसमें कोई पायथन पृष्ठभूमि नहीं है!) इसका अनुवाद करने के लिए और उसके बाद मेरा JSON डेटा उस साइट पर पोस्ट करें जिसके लिए उपयोगकर्ता/पास की आवश्यकता होती है, और फिर प्रतिक्रिया डेटा प्राप्त करें।पायथन से रूपांतरण के बाद रूबी में HTTP के माध्यम से JSON कैसे पोस्ट करूं?

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

जहां data है:

यह अजगर कोड है

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

मैं एक रेल आवेदन के साथ उपयोग के लिए रूबी में इस कोड की कार्यक्षमता को दोहराने के लिए कोशिश कर रहा हूँ, लेकिन बीच यह पता लगाने के लिए कि पाइथन requests.post() फ़ंक्शन कैसे संचालित होता है और फिर पोस्ट और जीईटी के लिए रूबी कोड लिखता है, मैं पूरी तरह से खो गया हूं।

मैंने कोशिश की Net :: HTTP लेकिन मैं स्पष्ट नहीं कर रहा हूँ अगर मैं उपयोगकर्ता नाम डाल दिया जाना चाहिए/शरीर में पास या basic_auth विधि का उपयोग करें - basic_authNet::HTTP.get अंदर ही काम करने लगता है ... और Net :: HTTP ऐसा लगता है कि JSON को आसानी से संभाल नहीं आता है, लेकिन फिर से, मैं इस बिंदु पर पूरी तरह से दोपहर के भोजन के लिए बाहर हो सकता है।

किसी भी सुझाव या मदद की सराहना की जाएगी!

उत्तर

16

rest-client मणि का उपयोग करें या बस Net::HTTP का उपयोग करें।

रूबी कोड (संस्करण 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

दो बातें -1) कहाँ JSON डेटा भेज दिया जाता है? 2) मेरा सिर्फ "rrno :: ECONNRESET: सहकर्मी द्वारा कनेक्शन रीसेट - SSL_connect" के साथ त्रुटियों के साथ त्रुटियां ... कोई विचार? – Dan

+0

1) JSON डेटा जोड़ें: req.body = {: some => 'data',: fun => 'times'}। To_json 2) शायद यह ओपनएसएसएल समस्या है: http://stackoverflow.com/questions/11321403/ openssl-trouble-with-ruby-1-9-3 – zhongguoa

+0

एक आकर्षण की तरह काम करते हुए बहुत बहुत धन्यवाद। अगर कोई और ओपनएसएसएल समस्या को हिट करता है, तो यह संसाधन सबसे अच्छा था और मेरी समस्या हल हो गई: http://railsapps.github.io/openssl-certificate-verify-failed.html – Dan

3

मैं RestClient मणि पर एक नज़र डालने की सलाह दूंगा। यह जीईटी/पोस्ट, साथ ही बाकी बाकी आरईएसटी कॉल से निपटना आसान बनाता है। इसमें आईआरबी-आधारित खोल भी है जिसे कमांड लाइन से उपलब्ध restclient कहा जाता है, जिससे आपकी कनेक्शन सेटिंग्स के साथ प्रयोग करना आसान हो जाता है।

प्रलेखन से

:

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

यह देखकर आप अजगर कोड के साथ समानता देख सकते हैं।

आप हैश करने के लिए प्रमाणीकरण की जानकारी जोड़ सकते हैं:

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 
) 

वैकल्पिक रूप से, आप Curb मणि इस्तेमाल कर सकते हैं। Curb libcurl का उपयोग किया, जो वेब कनेक्टिविटी के लिए एक उद्योग मानक उपकरण है। दस्तावेज POST अनुरोध भेजने के कई तरीके दिखाता है।

संबंधित मुद्दे