2011-04-26 148 views
60

我试图用Net::HTTP.get()为HTTPS URL:使用的Net :: HTTP.get为HTTPS URL

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

但是,我得到的,当我尝试打印结果如下结果:

can't convert URI::HTTPS into String

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

回答

111

原来的答复:

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'来代替,非常精美。 – sepiroth 2011-04-26 07:18:28

+0

hatorade,我无法通过“读”来为我工作。你可以发表一个完整的答案来解答你自己的问题吗? – frabcus 2011-09-30 10:48:18

+2

'VERIFY_NONE'暗示什么?应该做些什么呢? – 2011-12-30 22:58:43

4

这应该是看:

uri.port = Net::HTTP.https_default_port() 
@data = Net::HTTP.get(uri) 
+0

工作,但现在的外部API是抱怨,我发送一个普通的HTTP请求到HTTPS端口... – sepiroth 2011-04-26 06:44:55

+0

哈哈,正确;)见下面的解决方案Stef提供,它应该工作 – 2011-04-26 06:45:44

+0

它没有,我得到一个错误说“未定义的方法'use_ssl ='” – sepiroth 2011-04-26 06:53:21

21

编辑:我的方法工作,但贾森@ - 杨协成approach容易得多。

它显示为2.1.2 优选一个记录方法如下(直接引用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.

+2

这是不正确的。从Ruby 2.0.0开始,如果URI对象传递了一个“https”url,那么'Net :: HTTP.get'足以完成HTTPS获取请求。看到我的答案:http://stackoverflow.com/a/36543895/382740。 – 2016-04-11 08:50:21

9

在Ruby 2.0.0以上,简单地通过在URI对象与https网址足以执行HTTPS获取请求。

uri = URI('https://encrypted.google.com') 
Net::HTTP.get(uri) 

您可以通过使用过期证书进行上domain 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 

它是在这个commit在Ruby 2.0.0中引入的。

get_response方法,它是由Net::HTTP.get方法调用,sets:use_ssl为true时uri.scheme是 “HTTPS”。

声明:我明白这个问题是针对Ruby 1.8.7的,但由于这是搜索“https ruby​​”时搜索结果最少的搜索结果之一,因此我决定回答。