簡體   English   中英

如何在 Ruby 2 中為 Net::HTTP::Post.new 請求指定讀取超時

[英]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)

錯誤。 我認為我在某處遺漏了一些簡單的東西。 感激地收到所有線索

技術資料:

  • 紅寶石 2.0.0p247
  • 導軌 4.0.0
  • Windows 7 32 位紅寶石

通過此stackoverflow 答案解決

我改變了我的

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 的可能解決方案有何不同:

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

我抓住了 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM