2013-10-23 24 views
14

我有一篇文章發生在ruby腳本的Rails應用程序中。該腳本創建一個變量請求作爲如何在Ruby 2中爲Net :: HTTP :: Post.new請求指定讀取超時值

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 

爲PE r this stackoverflow answer但我得到了一個

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

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

技術信息:

  • 紅寶石2.0.0p247
  • 的Rails 4.0.0
  • 的Windows 7 32位紅寶石
+0

[Net :: HTTP獲取超時在Ruby中可能的重複](http://stackoverflow.com/questions/19325479/nethttp-get-timeout-in-ruby)也爲'.new',發佈和獲取應該是一樣。 –

+0

@CiroSantilli該問題沒有被接受的答案。這個雖然是我自己的,但確實如此。 – Jane

+0

[在Ruby Net :: HTTP.start中爲服務調用設置read \ _timeout]的可能重複(http://stackoverflow.com/questions/15157553/set-read-timeout-for-the-service-call-in -ruby-nethttp-start) –

回答

22

通過這個解決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)} 

,這似乎解決這個問題已經得到了。

+0

如果發佈,看起來像write_timeout會有意義。 :) – Eddie

20

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

注意:read_timeout以秒爲單位,而不是毫秒。 –

-4

如果有人仍面臨超時設置問題,Net::HTTP超時工作不正常,那麼你可以按照下面的方法,以及:

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

你應該知道'超時'使用線程,你需要知道[的影響](http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api /)。 –

+3

紅寶石超時是一個巨大的錘子,只會導致一個大混亂。不要使用它。 http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/ – AfDev