【问题标题】:Setting an HTTP Timeout in Ruby 1.9.3在 Ruby 1.9.3 中设置 HTTP 超时
【发布时间】:2014-08-14 18:16:13
【问题描述】:

我使用的是 Ruby 1.9.3,需要获取一个 URL。我与Net::HTTP 合作,但是,如果站点关闭,Net::HTTP 最终会挂起。

在搜索互联网时,我看到很多人都面临着类似的问题,但都采用了老套的解决方案。但是,其中许多帖子已经很老了。

要求:

  • 我更喜欢使用 Net::HTTP 来安装新的 gem。
  • 我需要正文和响应代码。 (例如 200)
  • 我不想require open-uri,因为这会导致全局变化并引发一些安全问题。
  • 我需要在 X 秒内获取 URL,否则返回错误。

使用 Ruby 1.9.3,如何在设置超时时获取 URL?


为了澄清,我现有的代码如下所示:

Net::HTTP.get_response(URI.parse(url))

尝试添加:

Net::HTTP.open_timeout(1000)

结果:

NoMethodError: undefined method `open_timeout' for Net::HTTP:Class

【问题讨论】:

    标签: ruby httprequest ruby-1.9.3 net-http


    【解决方案1】:

    您可以在建立连接之前设置Net::HTTP对象的open_timeout属性。

    uri = URI.parse(url)
    Net::HTTP.new(uri.hostname, uri.port) do |http|
      http.open_timeout = 1000
      response = http.request_get(uri.request_uri)
    end
    

    【讨论】:

    • Max - 我很困惑如何做到这一点。我在Net:HTTP class 上使用类方法get_request;然而open_timeoutHTTPSession 上的一个方法。 open_timeout 是否控制某些 Singleton 中的全局设置?
    • Net::HTTP 有很多令人困惑的类方法,它们基本上是创建Net::HTTP 对象的快捷方式(参见get_response 的源代码)。请参阅我的编辑,了解如何自己创建 Net::HTTP 对象。
    • 如何使用该代码获得结果 - 正文和 http 结果代码?
    • 请阅读文档。 http.request_get 返回与 Net::HTTP.get_response 相同的内容
    • 我试过了,new 方法不适用于我的块。我把new方法改成了start方法,整个事情正常了。
    【解决方案2】:

    我在这里尝试了所有解决方案以及有关此问题的其他问题,但我只使用以下代码解决了所有问题,open-uri gem 是 net::http 的包装器。 我需要一个必须等​​待比默认超时更长的时间并读取响应的获取。代码也比较简单。

    require 'open-uri'
    open(url, :read_timeout => 5 * 60) do |response|
      if response.read[/Return: Ok/i]
        log "sending ok"
      else
        raise "error sending, no confirmation received"
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 2013-10-19
      • 2014-03-01
      • 2023-03-20
      • 2016-12-20
      • 1970-01-01
      • 2012-05-16
      • 2010-09-18
      • 1970-01-01
      相关资源
      最近更新 更多