我正在尝试使用Net::HTTP.get()
https URL:
@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())
但是,当我尝试打印结果时,得到以下结果:
无法将URI :: HTTPS转换为String
这是怎么回事?我正在使用Ruby 1.8.7(OS X)
Answers:
原始答案:
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
URI.parse(uri_string).read
改为使用,如此精美。
VERIFY_NONE
意味着什么?应该怎么做呢?
require 'open-uri'
使.read起作用。
编辑:我的方法可行,但是@ 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。这不再是事实。
Net::HTTP.get
如果URI对象传递了https
URL ,就足以执行HTTPS获取请求。看到我的答案:stackoverflow.com/a/36543895/382740。
在Ruby 2.0.0及更高版本中,只需传递带有https
url的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”时搜索结果中最常见的几个之一,因此我还是决定回答。
http.use_ssl = true
强迫它实际使用ssl,然后事情如鱼得水。
这应该看起来像:
uri.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)
IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path )
不仅禁用SSL验证。就我们而言,安全性不是问题,服务器不受我们控制,这是一个临时解决方案。