使用 Net: : HTTP.get 获取 https URL

我正在尝试使用 Net::HTTP.get()的 https 网址:

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

但是,当我尝试打印结果时,会得到以下结果:

无法将 URI: : HTTPS 转换为字符串

怎么回事? 我用的是 Ruby 1.8.7(OS X)

89666 次浏览

Original answer:

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)

As pointed out in the comments, this is more elegant:

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

this should look as:

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

EDIT: My approach works, but @jason-yeo's approach is far easier.

It appears as of 2.1.2 the preferred a documented method is as follows (directly quoting 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.

In Ruby 2.0.0 and above, simply passing in an uri object with a https url is sufficient to do a HTTPS get request.

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

You may verify this by performing a get request on a domain with an expired certificate.

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

It was introduced by this commit in Ruby 2.0.0.

The get_response method, which is called by the Net::HTTP.get method, sets :use_ssl to true when the uri.scheme is "https".

Disclaimer: I understand that the question is for Ruby 1.8.7, but since this is one of the top few search results when one searches for "https ruby", I've decided to answer anyway.