2011-04-26 13 views
60

Estoy intentando utilizar Net::HTTP.get() para una dirección URL https:El uso de Net :: HTTP.get para una dirección URL HTTPS

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

Sin embargo, me da el resultado siguiente cuando intento imprimir los resultados:

can't convert URI::HTTPS into String

¿Cuál es el problema? Estoy usando Rubí 1.8.7 (OS X)

Respuesta

111

Respuesta original:

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) 

Como se señaló en los comentarios, esto es más elegante:

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

Voy a dar esto como la respuesta porque es la respuesta a lo que pregunté, pero la verdadera respuesta es señalar que me estoy acercando a este camino equivocado. Use 'URI.parse (uri_string) .read' en su lugar, funciona muy, muy bien. – sepiroth

+0

hatorade, no puedo conseguir eso con ".read" para que funcione para mí en absoluto. ¿podría publicar una respuesta completa a su propia pregunta con respecto a cómo hace esto? – frabcus

+2

¿Qué implica 'VERIFY_NONE'? ¿Qué debería posiblemente hacerse en su lugar? –

4

esto se vera como:

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

que funcionó, pero ahora la API externa se queja de que envié una solicitud HTTP simple a un puerto HTTPS ... – sepiroth

+0

jaja, a la derecha;) vea a continuación la solución proporcionada por Stef, debería funcionar –

+0

no, recibo un error diciendo "método indefinido' use_ssl = '" – sepiroth

21

EDIT: Mi enfoque funciona, pero @ Jason-Yeo de approach es mucho más fácil.

Aparece como de 2.1.2 la preferida, un método documentado es la siguiente (directamente citando the documentation):

HTTPS is enabled for an HTTP connection by #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 

In previous versions of Ruby you would need to require ‘net/https’ to use HTTPS. This is no longer true.

+2

Esto no es verdad. A partir de Ruby 2.0.0, 'Net :: HTTP.get' es suficiente para hacer una solicitud de obtención HTTPS si el objeto URI recibe una url' https'. Ver mi respuesta: http://stackoverflow.com/a/36543895/382740. –

9

en Ruby 2.0.0 y superiores, simplemente pasando en un objeto uri con una https url es suficiente para hacer una solicitud de obtención HTTPS.

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

Usted puede verificar esto mediante la realización de una petición GET en un domain con un certificado caducado.

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

Fue introducido por esta commit en Ruby 2.0.0.

El método get_response, que se llama por el método de Net::HTTP.get, sets:use_ssl a cierto cuando el uri.scheme es "https".

Descargo de responsabilidad: Entiendo que la pregunta es para Ruby 1.8.7, pero como este es uno de los primeros resultados de búsqueda cuando uno busca "https ruby", he decidido responder de todos modos.

Cuestiones relacionadas