नेट का उपयोग करना :: HTTP.get एक https url के लिए


84

मैं Net::HTTP.get()https URL के लिए उपयोग करने का प्रयास कर रहा हूं :

@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())

हालाँकि, जब मैं परिणाम प्रिंट करने की कोशिश करता हूं तो मुझे निम्नलिखित परिणाम मिलते हैं:

URI :: HTTPS को स्ट्रिंग में नहीं बदल सकते

क्या बात है? मैं रूबी 1.8.7 (ओएस एक्स) का उपयोग कर रहा हूं


एक FYI करें, हम अस्थायी रूप से एक 3rd पार्टी सर्वर से जुड़ रहे थे जिसमें प्रमाणपत्र समस्याएँ थीं, इसलिए हमें IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path )SSL सत्यापन को अक्षम करने के लिए उपयोग करना था । हमारे मामले में, सुरक्षा कोई समस्या नहीं थी, सर्वर हमारे नियंत्रण से बाहर था और यह एक अस्थायी समाधान था।
जोशुआ पिंटर

जवाबों:


156

मूल उत्तर:

uri = URI.parse("https://example.com/some/path")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
@data = http.get(uri.request_uri)

जैसा कि टिप्पणियों में बताया गया है, यह अधिक सुरुचिपूर्ण है:

require "open-uri"
@data = URI.parse("https://example.com/some/path").read

7
मैं इसे उत्तर के रूप में दूंगा क्योंकि यह मेरे द्वारा पूछे गए प्रश्न का उत्तर है, लेकिन असली उत्तर यह है कि मैं इस गलत तरीके से संपर्क कर रहा हूं। उपयोग URI.parse(uri_string).readके बजाय, इसलिए इतनी खूबसूरती से काम करता है।
टोनी स्टार्क

2
क्या मतलब VERIFY_NONEहै? इसके बजाय संभवतः क्या किया जाना चाहिए?
जोनाथन एलार्ड

1
यह एक ध्वज है जिसका अर्थ है कि प्रमाण पत्र की सत्यता को अनदेखा किया गया है, लेकिन यह कुछ समय पहले था इसलिए मुझे यकीन नहीं है कि आपको इसे सेट करने की आवश्यकता क्यों है।
स्टेफ

2
@frabcus, आपको require 'open-uri'काम करने के लिए .read की आवश्यकता है ।
जोश डी

1
ओपी के सवाल का कुछ भी मतलब नहीं है कि एसएसएल सत्यापन वांछित नहीं है, इसलिए आप VERIFY_NONE का सुझाव क्यों दे रहे हैं?
एलेक्स

35

संपादित करें: मेरा दृष्टिकोण काम करता है, लेकिन @ जेसन-यो का दृष्टिकोण कहीं अधिक आसान है।

यह 2.1.2 के रूप में प्रकट होता है , एक प्रलेखित विधि इस प्रकार है (सीधे दस्तावेज़ को उद्धृत करते हुए ):

HTTPS एक HTTP कनेक्शन के लिए # use_ssl = द्वारा सक्षम है।

uri = URI('https://secure.example.com/some_path?query=string')

Net::HTTP.start(uri.host, uri.port,   
  :use_ssl => uri.scheme == 'https') do |http|
  request = Net::HTTP::Get.new uri

  response = http.request request # Net::HTTPResponse object 
end 

रूबी के पिछले संस्करणों में आपको HTTPS का उपयोग करने के लिए 'नेट / https' की आवश्यकता होगी। यह अब सच नहीं है।


6
यह सच नहीं है। रूबी 2.0.0 के अनुसार, Net::HTTP.getयदि यूआरआई ऑब्जेक्ट एक httpsयूआरएल पास किया जाता है, तो एचटीटीपीएस प्राप्त करने के लिए अनुरोध करने के लिए पर्याप्त है । : मेरा उत्तर देखें stackoverflow.com/a/36543895/382740
जेसन येओ

19

रूबी 2.0.0 और इसके बाद के संस्करण में, बस एक httpsयूआरएल के साथ एक यूआरएल में गुजरना एक HTTPS अनुरोध प्राप्त करने के लिए पर्याप्त है।

uri = URI('https://encrypted.google.com')
Net::HTTP.get(uri)

आप एक एक्सपायर्ड सर्टिफिकेट वाले डोमेन पर रिक्वेस्ट देकर यह सत्यापित कर सकते हैं ।

uri = URI('https://expired.badssl.com/')
Net::HTTP.get(uri)
# OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed

इसे रूबी 2.0.0 में इस कमिट द्वारा पेश किया गया था ।

get_responseविधि है, जिसमें से पुकारा जाता है Net::HTTP.getविधि, सेट :use_ssl सच करने के लिए जब uri.schemeहै "https"।

डिस्क्लेमर: मैं समझता हूं कि प्रश्न रूबी 1.8.7 के लिए है, लेकिन चूंकि यह शीर्ष कुछ खोज परिणामों में से एक है जब कोई "https रूबी" खोजता है, तो मैंने वैसे भी जवाब देने का फैसला किया है।


4
डेटा बिंदु के रूप में, मैंने रूबी 2.2.10 में इसे सच नहीं पाया है। यह पोर्ट 443 पर कनेक्शन को खोलता है, लेकिन एसएसएल का उपयोग नहीं करता है। बेशक, विदेशी सर्वर का इससे कोई लेना-देना नहीं होगा, और बिना किसी जवाब के कनेक्शन को बंद कर दिया, जिसके कारण मेरे अंत में बहुत सारे दांत निकल आए। मुझे http.use_ssl = trueइसे वास्तव में ssl का उपयोग करने के लिए मजबूर करने के लिए कॉल करना पड़ा , और फिर चीजें तैर गईं।
डेविड हेम्पी

4

इस रूप में दिखना चाहिए:

uri.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)

काम किया है, लेकिन अब बाहरी एपीआई शिकायत कर रहा है कि मैंने HTTPS पोर्ट के लिए एक सादे HTTP अनुरोध भेजा है ...
टोनी स्टार्क

Haha, ठीक है;) नीचे दिए गए समाधान देखें Stef प्रदान की, यह काम करना चाहिए
व्लाद खोमिच

यह नहीं है, मुझे "अपरिभाषित विधि 'use_ssl ='" कहने में त्रुटि मिलती है
टोनी स्टार्क

2
'नेट / https' की भी आवश्यकता है
व्लाद खोमिच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.