以下代码无法执行:
require 'net/http'
uri = URI('https://example.com:8443')
http = Net::HTTP.new(uri.host, uri.port)
# Enable SSL/TLS ?
if uri.scheme == "https"
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = File.join(File.dirname(__FILE__), "ca-rsa-cert.pem")
end
http.start {
http.request(uri)
}
错误是:
$ ./TestCert.rb
/usr/lib/ruby/1.9.1/net/http.rb:1292:in `request': undefined method `set_body_internal'
for #<URI::HTTPS:0x00000001a47fd0 URL:https://example.com:8443> (NoMethodError)
from ./TestCert.rb:16:in `block in <main>'
from /usr/lib/ruby/1.9.1/net/http.rb:745:in `start'
from ./TestCert.rb:15:in `<main>'
不同于Ruby NoMethodError (undefined method `set_body_internal') with HTTP get ,我正在使用 HTTPS,我不关心响应。我只需要 Ruby 建立连接来测试 SSL/TLS 服务器。
我确实尝试针对相关问题获取响应,但出现了同样的错误:
http.start {
response = http.request uri
}
这有同样的错误:
response = http.start {
http.request uri
}
http.get
也失败了(但有不同的错误 - undefined method 'empty?'
):
response = http.start {
http.get uri
}
还有另一个失败(但有不同的错误 - undefined method 'empty?'
):
http.start {
response = http.get uri
}
如果重要的话,这是一个运行 Ruby 1.9.3p194 的 Debian 7.3 (x64) 系统。
如何使用 Ruby 通过 SSL/TLS 发出 HTTP 请求?
我认为你调用 http.request(uri)
是错误的,你应该传递一种像 Net::HTTP::Get
这样的请求对象,而不是 URI
。尝试使用以下代码:
require 'net/http'
uri = URI('https://example.com:8443')
http = Net::HTTP.new(uri.host, uri.port)
# Enable SSL/TLS ?
if uri.scheme == "https"
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = File.join(File.dirname(__FILE__), "ca-rsa-cert.pem")
end
req = Net::HTTP::Get.new('/')
http.request(req)
或直接调用request_get('/')
.该方法将为您创建 Get
对象,如文档说明:
def request_get(path, initheader = nil, &block) # :yield: +response+
request(Get.new(path, initheader), &block)
end
我是一名优秀的程序员,十分优秀!