Ruby 使用Net::HTTP.get作为https url
我正在尝试使用Ruby 使用Net::HTTP.get作为https url,ruby,Ruby,我正在尝试使用Net::HTTP.get()作为https URL: @data = Net::HTTP.get(uri, Net::HTTP.https_default_port()) 但是,当我尝试打印结果时,得到以下结果: 无法将URI::HTTPS转换为字符串 怎么回事?我使用的是Ruby 1.8.7(OS X)原始答案: uri = URI.parse("https://example.com/some/path") http = Net::HTTP.new(uri.host, ur
Net::HTTP.get()
作为https URL:
@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())
但是,当我尝试打印结果时,得到以下结果:
无法将URI::HTTPS转换为字符串
怎么回事?我使用的是Ruby 1.8.7(OS X)原始答案:
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.port = Net::HTTP.https_default_port()
@data = Net::HTTP.get(uri)
编辑:我的方法可行,但@jason yeo的方法要简单得多 从2.1.2开始,首选的文件化方法如下(直接引用): HTTPS通过#use_ssl=为HTTP连接启用
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。这不再是事实
在Ruby 2.0.0及更高版本中,只需传递带有
https
url的uri对象就足以执行https get请求
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\u response
方法,由Net::HTTP.get
方法调用,:当uri.scheme
为“https”时,使用\u ssl
为true
免责声明:我知道这个问题是针对Ruby 1.8.7的,但由于这是搜索“https Ruby”时最热门的几个搜索结果之一,所以我决定无论如何回答。这是可行的,但现在外部API抱怨我向https端口发送了一个普通HTTP请求……哈哈,对不对;)请参阅下面提供的解决方案Stef,它应该不起作用,我收到一个错误,说“undefined method`use_ssl=”,尝试也要求“net/https”,我会给出这个答案,因为这是我所问问题的答案,但真正的答案是指出我的做法是错误的。使用
URI.parse(URI\u string)。改为阅读
,效果非常好。VERIFY\u NONE
意味着什么?应该做些什么呢?这是一个标志,表示证书的准确性被忽略,但这是很久以前的事了,所以我不确定您为什么需要设置它。@frabcus,您需要要求“打开uri”
才能使.read工作。OP的问题中没有任何东西暗示不需要SSL验证,那你为什么建议不验证?这不是真的。从Ruby 2.0.0开始,如果向URI对象传递了HTTPS
url,那么Net::HTTP.get
就足以执行HTTPS get请求。请参阅我的答案:。作为一个数据点,我发现ruby 2.2.10中的情况并非如此。它确实在端口443上打开了连接,但没有使用SSL。当然,外国服务器与此无关,并且在没有回复的情况下关闭了连接,这导致了我这一方非常恼火。我不得不调用http.use_ssl=true
强制它实际使用ssl,然后一切顺利。仅供参考,我们临时连接到一个有证书问题的第三方服务器,所以我们不得不使用IO.copy_流(打开(url,{ssl_验证_模式:OpenSSL::ssl::verify_NONE}),下载路径)
仅禁用SSL验证。在我们的例子中,安全不是问题,服务器超出了我们的控制,这是一个临时解决方案。