Использование Net:: HTTP.сделать для URL-адреса https


Я пытаюсь использовать Net::HTTP.get() для https URL:

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

однако, я получаю следующий результат, когда я пытаюсь распечатать результаты:

не удается преобразовать URI:: HTTPS в строку

в чем дело? Я использую Ruby 1.8.7 (OS X)

4 66

4 ответа:

оригинальный ответ:

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

EDIT: мой подход работает, но @jason-yeo подход - это гораздо легче.

он появляется в 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 

в предыдущих версиях Ruby вам потребуется использовать ' net / https ПРОТОКОЛ HTTPS. Это уже не так.

в Ruby 2.0.0 и выше, просто передавая объект uri с https URL-адреса достаточно, чтобы сделать GET запрос по протоколу HTTPS.

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

вы можете проверить это, выполнив запрос GET на домен с просроченным сертификатом.

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

это было введено этим commit в Ruby 2.0.0.

The get_response метод, который называется Net::HTTP.get метод наборы:use_ssl в true, если uri.scheme is "протокол https."

отказ от ответственности: я понимаю, что вопрос для Ruby 1.8.7, но поскольку это один из лучших результатов поиска при поиске "https ruby", я решил ответить в любом случае.

это должно выглядеть так:

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