2013-10-23 16 views
14

Ho un post che si verifica su un'applicazione di rails da uno script ruby. Lo script crea una richiesta variabile comeCome specificare un timeout di lettura per una richiesta Net :: HTTP :: Post.new in Ruby 2

request = Net::HTTP::Post.new(url.path) 

che viene poi utilizzato come segue

request.content_type = "application/json"  
request.body = JSON.generate(params) 

response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 

C'è un bel po 'di elaborazione accadendo sul lato server, e sto ottenendo un errore di Net::ReadTimeout

ho cercato di specificare un periodo di timeout

request.read_timeout = 500 

come pe r this stackoverflow answer ma ho ottenuto un

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

errore. Presumo che mi manca qualcosa di semplice da qualche parte. Tutti gli indizi con gratitudine

Informazioni tecniche:

  • Rubino 2.0.0p247
  • Rails 4.0.0
  • Windows 7 a 32 bit rubino
+0

possibile duplicato di [Net :: HTTP get timeout in Ruby] (http://stackoverflow.com/questions/19325479/nethttp-get-timeout-in-ruby) Anche per '.new', post e get dovrebbero essere lo stesso. –

+0

@CiroSantilli che la domanda non ha una risposta accettata. Questo fa, anche se il mio. – Jane

+0

possibile duplicato di [Imposta leggere \ _timeout per la chiamata di servizio in Ruby Net :: HTTP.start] (http://stackoverflow.com/questions/15157553/set-read-timeout-for-the-service-call-in -ruby-nethttp-start) –

risposta

22

risolto tramite questo stackoverflow answer

Ho cambiato il mio

response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)} 

linea per essere

response = Net::HTTP.start(url.host, url.port, :read_timeout => 500) {|http| http.request(request)} 

e questo sembra aver avuto questo problema.

+0

Se sta postando, sembra che write_timeout abbia senso. :) – Eddie

20

Il read_timeout è disponibile con una pianura Net::HTTP oggetto:

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

Nota: read_timeout è espresso in secondi, non in millis. –

-4

Se qualcuno sta ancora affrontando timeout problema impostazione e Net::HTTP timeout non funziona come previsto, allora si può seguire qui sotto approccio così:

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

Dovresti sapere che 'Timeout' usa i thread e devi essere consapevole di [le implicazioni di ciò] (http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api /). –

+3

Ruby's Timeout è un martello gigante e porterà solo a un gran casino. Non usarlo http://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/ – AfDev

Problemi correlati