Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用Net::HTTP.get作为https url_Ruby - Fatal编程技术网

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验证。在我们的例子中,安全不是问题,服务器超出了我们的控制,这是一个临时解决方案。