J’essaie d’utiliser Net::HTTP.get()
pour une URL https:
@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())
Cependant, j’obtiens le résultat suivant lorsque j’essaie d’imprimer les résultats:
ne peut pas convertir l’URI :: HTTPS en chaîne
Quel est le problème? J’utilise Ruby 1.8.7 (OS X)
Réponse originale:
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)
Comme indiqué dans les commentaires, ceci est plus élégant:
require "open-uri" @data = URI.parse("https://example.com/some/path").read
EDIT: Mon approche fonctionne, mais l’approche de @ jason-yeo est beaucoup plus facile.
Il semble qu’à partir de 2.1.2 la méthode documentée préférée est la suivante (en citant directement la documentation ):
HTTPS est activé pour une connexion HTTP par # use_ssl =.
uri = URI('https://secure.example.com/some_path?query=ssortingng') 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
Dans les versions précédentes de Ruby, vous deviez exiger que «net / https» utilise HTTPS. Ce n’est plus vrai.
Dans Ruby 2.0.0 et versions ultérieures, il suffit de transmettre un object uri avec une URL https
pour effectuer une demande d’obtention HTTPS.
uri = URI('https://encrypted.google.com') Net::HTTP.get(uri)
Vous pouvez vérifier cela en effectuant une demande de transfert sur un domaine avec un certificate expiré.
uri = URI('https://expired.badssl.com/') Net::HTTP.get(uri) # OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificatee verify failed
Il a été introduit par ce commit dans Ruby 2.0.0.
La méthode get_response
, appelée par la méthode Net::HTTP.get
, définit :use_ssl
sur true lorsque uri.scheme
est “https”.
Disclaimer: Je comprends que la question est pour Ruby 1.8.7, mais comme c’est l’un des premiers résultats de recherche quand on cherche “https ruby”, j’ai décidé de répondre quand même.
cela devrait ressembler à:
uri.port = Net::HTTP.https_default_port() @data = Net::HTTP.get(uri)