17

Ruby 中是否有用于 HTTPS 请求的 gem 或库?它叫什么,你能提供一些示例用法吗?

我想做的是打开一个页面,从中解析一些文本,然后输出它。

4

2 回答 2

32

使用 Ruby 标准库的 SSL 请求

require 'net/http'
require 'uri'
Net::HTTP.get URI('https://encrypted.google.com')

Net::HTTP在 Ruby (>= 2.0.0) 中,如果您将具有“https”URL 的 URI 对象传递给它,则默认情况下会执行 SSL 验证。见https://github.com/ruby/ruby/blob/778bbac8ac2ae50f0987c4888f7158296ee5bbdd/lib/net/http.rb#L481

您可以通过对具有过期证书的执行获取请求来验证这一点。

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 HTTP gem 的 SSL 请求

如果您希望使用替代方案,您可以使用以下默认情况下也执行 SSL 验证的 gem:

  1. 艾康

Excon 是一个纯 Ruby HTTP 实现。

require 'excon'
Excon.get 'https://encrypted.google.com'
  1. 抑制

Curb 是一个在底层使用 libcurl 的 HTTP 客户端。

require 'curl'
Curl.get 'https://encrypted.google.com'
  1. http.rb

HTTP 或 http.rb 是纯 Ruby HTTP 实现,但使用http_parser.rb来解析 HTTP 请求和响应。由于 http_parser.rb 使用原生扩展,它声称是最快的 HTTP 客户端库之一。但与往常一样,对基准持保留态度。

require 'http'
HTTP.get 'https://encrypted.google.com'
  1. HTTP客户端

HTTPClient 是另一个纯 Ruby 实现。

require 'httpclient'
HTTPClient.get 'https://encrypted.google.com'

这里列出的是 HTTP 库而不是 HTTP 包装器。像HTTPartyFaraday这样的包装器 gem或者包装特定的 HTTP 实现,或者使用适配器来提供统一的 HTTP 接口。您可以查看这个Ruby HTTP 客户端功能的比较矩阵。它比较了每个 HTTP 客户端库的功能。但请注意,该信息自 2012 年以来未更新

于 2012-10-14T15:36:05.677 回答
2

语言中有一个集成库,称为Net::HTTP

它的一个示例用法是:

uri = URI('https://example.com/some_path?query=string')
response = Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Get.new uri.request_uri
  http.request request # Net::HTTPResponse object
end
puts response.body

更新: 您需要像这样包含该库:

require 'net/https'
于 2012-10-14T15:33:00.080 回答