【问题标题】:Net::HTTP not sending requestNet::HTTP 不发送请求
【发布时间】:2023-03-10 08:26:02
【问题描述】:

我在我们的Ruby 1.8.7项目中有如下方法:

def self.ping_server
  request_data = get_request_data

  uri = 'another_server.our_company.com'
  https = Net::HTTP.new(uri)
  https.use_ssl = true
  path = "/our_service"
  data = request_data.to_json
  response = https.post(path, data, {'Content-Type' => 'application/json'})

  return response
end

每当我运行此方法时,我都会收到以下超时错误:

在 128936 毫秒内完成 500 内部服务器错误

Errno::ETIMEDOUT (Connection timed out - connect(2)):
  lib/my_class.rb:51:in `ping_our_server'

我咨询了一位可以访问 another_server.our_company.com 日志的同事。我的请求没有到达其他服务器。

我应该怎么做才能让我的请求生效?


编辑:经过进一步检查,这就是我认为正在发生的事情(但我不完全确定):我们的其他服务器将只接受 HTTPS 请求,但看起来我的请求正在出于某种原因通过 HTTP 发送。我需要添加什么来确保我的请求是通过 HTTPS 发送的吗?

【问题讨论】:

    标签: ruby connection-timeout net-http ruby-1.8.7


    【解决方案1】:

    根据this website,这是您发送 HTTPS 请求的方式:

    require "net/https"
    require "uri"
    
    uri = URI.parse("https://secure.com/")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    
    request = Net::HTTP::Get.new(uri.request_uri)
    
    response = http.request(request)
    response.body
    response.status
    response["header-here"] # All headers are lowercase
    

    根据this website(链接自我的第一个链接),您还应该这样做以关闭net/https 库中的漏洞:

    要开始,您需要一个本地 CA 证书包,官方 curl站点维护一个最新的cacert.pem / ca-bundle.crt文件 如果需要,包含所有主要证书。

    接下来,在 gem install always_verify_ssl_certificates 之后,您可以 启动并运行测试,如下所示:

    require 'always_verify_ssl_certificates'
    AlwaysVerifySSLCertificates.ca_file = "/path/path/path/cacert.pem"
    
    http= Net::HTTP.new('https://some.ssl.site', 443)
    http.use_ssl = true
    req = Net::HTTP::Get.new('/')
    response = http.request(req)
    

    如果网站 证书错误,此时将引发错误。如果没有,一个 将返回合法的 HTTP 响应对象。

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 2022-08-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 2023-03-18
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多