使用Net :: HTTP.get作为https URL


84

我正在尝试使用Net::HTTP.get()https URL:

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

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

无法将URI :: HTTPS转换为String

这是怎么回事?我正在使用Ruby 1.8.7(OS X)


只是一个FYI,我们暂时连接到存在证书问题的第三方服务器,因此我们不得IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path )不仅禁用SSL验证。就我们而言,安全性不是问题,服务器不受我们控制,这是一个临时解决方案。
约书亚·品特

Answers:


156

原始答案:

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

7
我将其作为答案,因为它是我所要回答的问题,但真正的答案是指出我正以错误的方式来对待。URI.parse(uri_string).read改为使用,如此精美。
托尼·史塔克

2
VERIFY_NONE意味着什么?应该怎么做呢?
乔纳森·阿拉德

1
这是一个标志,表示证书的准确性被忽略,但这是前一阵子,所以我不确定为什么需要设置它。
stef 2012年

2
@frabcus,您需要require 'open-uri'使.read起作用。
Josh D

1
OP的问题中没有任何内容暗示不需要SSL验证,那么为什么要建议VERIFY_NONE?
Alex

35

编辑:我的方法可行,但是@ jason-yeo的方法要容易得多。

从2.1.2开始,似乎首选的记录方法如下(直接引用document):

#use_ssl =为HTTP连接启用了HTTPS。

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。这不再是事实。


6
这不是真的。从Ruby 2.0.0开始,Net::HTTP.get如果URI对象传递了httpsURL ,就足以执行HTTPS获取请求。看到我的答案:stackoverflow.com/a/36543895/382740
杨Ja雄

19

在Ruby 2.0.0及更高版本中,只需传递带有httpsurl的uri对象就足以执行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

它是由Ruby 2.0.0中的此提交引入的。

get_response方法调用的Net::HTTP.get方法,当方法为“ https”时,设置 :use_ssl为true uri.scheme

免责声明:我知道问题是针对Ruby 1.8.7的,但是由于这是当一个人搜索“ https ruby​​”时搜索结果中最常见的几个之一,因此我还是决定回答。


4
作为数据点,我发现在ruby 2.2.10中不是这样。它确实打开了端口443上的连接,但未使用SSL。当然,外部服务器与它无关,并在没有回复的情况下关闭了连接,这导致了我的不满。我不得不打电话http.use_ssl = true强迫它实际使用ssl,然后事情如鱼得水。
David Hempy

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.