使用Net :: HTTP.get作为https网址

Ton*_*ark 78 ruby

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

@data = Net::HTTP.get(uri, Net::HTTP.https_default_port())
Run Code Online (Sandbox Code Playgroud)

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

无法将URI :: HTTPS转换为String

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

ste*_*tef 145

原始答案:

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)
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的那样,这更优雅:

require "open-uri"
@data = URI.parse("https://example.com/some/path").read
Run Code Online (Sandbox Code Playgroud)

  • 我会以此作为答案,因为这是我所要求的答案,但真正的答案是指出我正以错误的方式接近这一点.使用`URI.parse(uri_string).read`代替,工作如此,非常漂亮. (7认同)
  • "VERIFY_NONE"意味着什么?应该做些什么呢? (2认同)
  • @frabcus,你需要'require'open-uri'`让.read工作. (2认同)
  • 请注意,设置 `http.verify_mode = OpenSSL::SSL::VERIFY_NONE` 将禁用证书验证。攻击者可能能够冒充您正在连接的服务器。换句话说,除了加密之外,您根本无法从 SSL 中获得太多好处。 (2认同)

eeb*_*sen 32

编辑:我的方法有效,但@ jason-yeo的方法要容易得多.

从2.1.2开始,首选的文档化方法如下(直接引用文档):

通过#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 
Run Code Online (Sandbox Code Playgroud)

在以前的Ruby版本中,您需要使用'net/https'来使用HTTPS.这不再是真的.

  • 这不是真的.从Ruby 2.0.0开始,如果URI对象传递了一个`https` url,`Net :: HTTP.get`就足以执行HTTPS get请求.请参阅我的回答:http://stackoverflow.com/a/36543895/382740. (6认同)

Jas*_*Yeo 17

在Ruby 2.0.0及更高版本中,只需使用httpsurl 传入uri对象就足以执行HTTPS get请求.

uri = URI('https://encrypted.google.com')
Net::HTTP.get(uri)
Run Code Online (Sandbox Code Playgroud)

您可以通过在具有过期证书的上执行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
Run Code Online (Sandbox Code Playgroud)

它是由Ruby 2.0.0中的这个提交引入的.

get_response方法调用的Net::HTTP.get方法在"https" 时设置 :use_ssl为true uri.scheme.

免责声明:我理解这个问题适用于Ruby 1.8.7,但由于这是搜索"https ruby​​"时搜索结果最少的搜索结果之一,所以无论如何我决定回答.

  • 作为数据点,我发现在ruby 2.2.10中不是这样。它确实打开了端口443上的连接,但未使用SSL。当然,外部服务器与它无关,并在没有回复的情况下关闭了连接,这导致了我的不满。我不得不调用`http.use_ssl = true`来强制它实际使用ssl,然后事情进展顺利。 (3认同)