25

我有一个来自 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

根据这个stackoverflow答案,但我得到了

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

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

技术信息:

  • 红宝石 2.0.0p247
  • 导轨 4.0.0
  • Windows 7 32 位红宝石
4

5 回答 5

39

通过this 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)}

这似乎已经解决了这个问题。

于 2013-10-23T16:38:26.957 回答
31

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

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

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

http.request_post(url.path, JSON.generate(params)) do |response|
  # do something with response
  p response
end
于 2013-10-23T16:38:44.590 回答
1

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

这当然不是我所期望的行为。

有关此主题的更多信息以及 Ruby < 2.5 和 >= 2.5 的可能解决方案有何不同,请参见此处:

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

于 2019-12-04T23:55:44.670 回答
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)
于 2019-12-16T10:09:20.533 回答
-7

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

begin
    Timeout::timeout(10) {
        ####
        ## YOUR REQUEST CODE WILL BE HERE
        ####
    }
rescue
    408
end
于 2015-08-06T12:52:50.967 回答