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

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

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

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

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

Какая сделка? Я использую Ruby 1.8.7 (OS X)

Ответ 1

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

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

Ответ 2

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. Это уже не так.

Ответ 3

В Ruby 2.0.0 и выше просто передать объект uri с URL-адресом 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

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

Метод get_response, который вызывается методом Net::HTTP.get, устанавливает :use_ssl в true, когда uri.scheme "HTTPS".

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

Ответ 4

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

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