[英]How to specify a read timeout for a Net::HTTP::Post.new request in Ruby 2
我有一篇關於 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)
錯誤。 我認為我在某處遺漏了一些簡單的東西。 感激地收到所有線索
技術資料:
我改變了我的
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)}
這似乎解決了這個問題。
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
有一點要記住的是,如果read_timeout
被設置為一個很小的值,使得超時確實發生... Net::HTTP
將“很有幫助”重試請求。 對於慢速 HTTP 服務器,可能不會向調用Net::HTTP
的代碼引發超時錯誤,直到read_timeout
值的2 read_timeout
。
這當然不是我期望的行為。
可以在此處找到有關此主題的更多信息以及 Ruby < 2.5 和 >= 2.5 的可能解決方案有何不同:
我抓住了 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)
如果有人仍然面臨超時設置問題並且Net::HTTP
超時未按預期工作,那么您也可以遵循以下方法:
begin
Timeout::timeout(10) {
####
## YOUR REQUEST CODE WILL BE HERE
####
}
rescue
408
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.