在Ruby 1.9.3中设置HTTP超时

时间:2014-06-24 13:04:09

标签: ruby httprequest ruby-1.9.3 net-http

我正在使用Ruby 1.9.3并且需要获取URL。我与Net::HTTP合作,但是,如果网站停用,Net::HTTP最终会挂起。

在搜索互联网时,我看到很多人都面临类似的问题,所有人都有黑客解决方案。但是,很多帖子都很老了。

要求:

  • 我更喜欢使用Net::HTTP安装新的gem。
  • 我需要Body和Response Code。 (例如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

2 个答案:

答案 0 :(得分:3)

您可以在建立连接之前设置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

答案 1 :(得分:2)

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

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