ruby-on-rails - restful - ruby on rails tutorial
ruby rest-client: ¿hacer que nunca se agote el tiempo? (6)
Esta sintaxis establece el tiempo de espera como encabezado de solicitud (consulte la firma RestClient.post), si desea usar el parámetro de tiempo de espera, debe usar:
RestClient::Request.execute(:method => :post, :url => @url, :timeout => 90000000)
consulte: https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L12
Estoy tratando de usar ruby rest-client para cargar una gran cantidad de imágenes a un sitio que estoy escribiendo. Mi código se ve como:
RestClient.post url, :timeout => 90000000, :open_timeout => 90000000, :file_param => file_obj
Sin embargo, estoy recibiendo este error:
RestClient::RequestTimeout: Request Timeout
from /Library/Ruby/Gems/1.8/gems/rest-client-1.6.1/lib/restclient/request.rb:174:in `transmit''
from /Library/Ruby/
Pero cuando miro el registro del servidor
Completed in 61493ms (View: 2, DB: 1) | 201 Created
Así que no parece haber ninguna razón por la que esto sea un tiempo de espera. ¿Alguien tiene alguna idea de si hay un parámetro de tiempo de espera que no estoy configurando correctamente?
Gracias
Estoy teniendo problemas similares. Una rápida inmersión en la fuente revela este poco de hostilidad:
def self.post(url, payload, headers={}, &block)
Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block)
end
A menos que me falte algo, las opciones de tiempo de espera no se transfieren a la solicitud subyacente. Tiempo para un parche ...
He usado el siguiente código y funciona como un amuleto como lo señaló Richard
resource = RestClient::Resource.new "url",
:timeout => $TIMEOUT,
:open_timeout => $OPEN_TIMEOUT
response = resource.get :params => { ..... }
Mirando los documentos, puede pasar -1 a través de RestClient.execute timeout param:
# * :timeout and :open_timeout passing in -1 will disable the timeout by setting the corresponding net timeout values to nil
Se puede utilizar de la siguiente manera:
resource = RestClient::Resource.new(
"url",
:timeout => -1,
:open_timeout => -1
response = resource.get :params => {<params>}
RestClient :: Resource.new () le permite configurar: timeout y: open_timeout que se pasarán al método Request.execute, cuando use los métodos get, post, put, etc del recurso.
Ya uso RestClient.get y RestClient.post ampliamente, por lo que para mí fue más fácil usar RestClient ''Monkey Patch''. Recomendaría usar RestClient::Resource.new
o RestClient::Request.Execute
si es posible.
Sin embargo, como soy perezoso y no quiero cambiar cada vez que RestClient.get
/ RestClient.post
en mi código, he decidido tomar un atajo.
$timeout = 30
$open_timeout = 30
module RestClient2
include RestClient
def self.get(url, headers={}, &block)
Request.execute(:method => :get, :url => url, :headers => headers,
:timeout => $timeout, :open_timeout => $open_timeout, &block)
end
def self.post(url, payload, headers={}, &block)
Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers,
:timeout => $timeout, :open_timeout => $open_timeout, &block)
end
end
Y que acabo de reemplazar rápidamente RestClient.get / post con RestClient2.get
/ post.
Sería bueno si RestClient::Request
tuviera un tiempo de espera predeterminado especificado, como:
@timeout = args[:timeout] || 30
@open_timeout = args[:open_timeout] || 30