Reputation: 25538
I'm trying to use Net::HTTP.get()
for an https URL:
@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())
However, I get the following result when I try to print the results:
can't convert URI::HTTPS into String
What's the deal? I'm using Ruby 1.8.7 (OS X)
Upvotes: 93
Views: 94447
Reputation: 14268
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
Upvotes: 167
Reputation: 5148
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.
Upvotes: 39
Reputation: 3702
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.
Upvotes: 28
Reputation: 5880
this should look as:
uri.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)
Upvotes: 4