我从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)
错误。我假设我在某处遗漏了一些简单的东西。所有线索都感激不尽
技术信息:
答案 0 :(得分:31)
我改变了我的
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的可能解决方案的不同之处,可以在这里找到:
答案 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