如何在Ruby 2中为Net :: HTTP :: Post.new请求指定读取超时

时间:2013-10-23 16:25:29

标签: ruby-on-rails ruby

我从ruby脚本发现了一个rails应用程序的帖子。该脚本以

创建变量请求
request = Net::HTTP::Post.new(url.path)

然后按如下方式使用

request.content_type = "application/json"    
request.body =  JSON.generate( params )

response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}

服务器端发生了很多处理,我收到Net::ReadTimeout错误

我尝试指定超时期限

request.read_timeout = 500

根据this stackoverflow answer,但我得到了

undefined method `read_timeout=' for #<Net::HTTP::Post POST> (NoMethodError)

错误。我假设我在某处遗漏了一些简单的东西。所有线索都感激不尽

技术信息:

  • Ruby 2.0.0p247
  • Rails 4.0.0
  • Windows 7 32位ruby

5 个答案:

答案 0 :(得分:31)

通过此stackoverflow answer

解决

我改变了我的

response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}

response = Net::HTTP.start(url.host, url.port, :read_timeout => 500) {|http| http.request(request)}

这似乎解决了这个问题。

答案 1 :(得分:27)

read_timeout可用普通Net::HTTP对象:

url = URI.parse('http://google.com')

http = Net::HTTP.new(url.host, url.port)
http.read_timeout = 500 # seconds

http.request_post(url.path, JSON.generate(params)) do |response|
  # do something with response
  p response
end

答案 2 :(得分:1)

要记住的一件事是,如果将read_timeout设置为较小的值,以致发生超时 ... Net::HTTP将“有帮助”地重试请求。对于速度较慢的HTTP服务器,直到 2x Net::HTTP值之前,调用read_timeout的代码可能不会引起超时错误。

这肯定不是我期望的行为。

有关此主题的更多信息以及Ruby <2.5和> = 2.5的可能解决方案的不同之处,可以在这里找到:

https://stackoverflow.com/a/59186209/5299483

答案 3 :(得分:0)

我同时捕获了OpenTimeout和ReadTimeout,并且可以正常工作。 在Ruby中测试:2.6.5

def ping(host, port)
    begin
        url = URI.parse("http://#{host}:#{port}/ping")
        req = Net::HTTP::Get.new(url.to_s)

        # setting both OpenTimeout and ReadTimeout
        res = Net::HTTP.start(url.host, url.port, :open_timeout => 3, :read_timeout => 3) {|http|
          http.request(req)
        }

        if JSON.parse(res.body)["ok"]
          # return true
          STDERR.puts "#{host}:#{port} is reachable"
        else
          STDERR.puts "#{host}:#{port} is NOT reachable"
        end
    rescue Net::ReadTimeout => exception
        STDERR.puts "#{host}:#{port} is NOT reachable (ReadTimeout)"
    rescue Net::OpenTimeout => exception
        STDERR.puts "#{host}:#{port} is NOT reachable (OpenTimeout)"
    end

end

ping("#{ENV['FIRST_HOST']}", 2345)
ping("#{ENV['SECOND_HOST']}", 2345)

答案 4 :(得分:-4)

如果有人仍面临超时设置问题且Net::HTTP超时未按预期工作,那么您也可以遵循以下方法:

begin
    Timeout::timeout(10) {
        ####
        ## YOUR REQUEST CODE WILL BE HERE
        ####
    }
rescue
    408
end