Использование Net :: HTTP.get для https URL - PullRequest
74 голосов
/ 26 апреля 2011

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

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

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

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

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

Ответы [ 4 ]

141 голосов
/ 26 апреля 2011

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

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
28 голосов
/ 22 июня 2014

РЕДАКТИРОВАТЬ: Мой подход работает, но подход @ 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.Это больше не верно.

16 голосов
/ 11 апреля 2016

В Ruby 2.0.0 и выше для передачи запроса HTTPS достаточно просто передать объект uri с https url.

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

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

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

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

4 голосов
/ 26 апреля 2011

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

uri.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...