Ruby rest-client: сделать это никогда не тайм-аутом?
Я пытаюсь использовать ruby rest-client для загрузки большого количества изображений на сайт, который я пишу. Мой код выглядит так:
RestClient.post url, :timeout => 90000000, :open_timeout => 90000000, :file_param => file_obj
Однако я получаю эту ошибку:
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/
Но когда я смотрю на журнал сервера
Completed in 61493ms (View: 2, DB: 1) | 201 Created
Таким образом, по-видимому, нет причин, по которым это время. Кто-нибудь знает, есть ли параметр таймаута, который я неправильно устанавливаю?
Спасибо
Ответы
Ответ 1
Этот синтаксис устанавливает тайм-аут как заголовок запроса (см. подпись RestClient.post), если вы хотите использовать параметр таймаута, который вы должны использовать:
RestClient::Request.execute(:method => :post, :url => @url, :timeout => 90000000)
см. https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L12
Ответ 2
Глядя на документы, вы можете передать -1 через параметр ожидания RestClient.execute:
# * :timeout and :open_timeout passing in -1 will disable the timeout by setting the corresponding net timeout values to nil
Его можно использовать следующим образом:
resource = RestClient::Resource.new(
"url",
:timeout => -1,
:open_timeout => -1
response = resource.get :params => {<params>}
Ответ 3
Я использовал следующий код и работает как шарм, как указал Ричард
resource = RestClient::Resource.new "url",
:timeout => $TIMEOUT,
:open_timeout => $OPEN_TIMEOUT
response = resource.get :params => { ..... }
Ответ 4
Я уже использую RestClient.get и RestClient.post широко, поэтому для меня было проще "Monkey Patch" RestClient. Я бы рекомендовал использовать RestClient::Resource.new
или RestClient::Request.Execute
, если это возможно.
Однако, поскольку я ленив и не хочу переключаться с каждым появлением RestClient.get
/RestClient.post
в моем коде, я решил сделать ярлык.
$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
А чем я просто просто заменил RestClient.get/post с помощью RestClient2.get
/post.
Было бы неплохо, если бы RestClient::Request
имел заданный по умолчанию тайм-аут, например:
@timeout = args[:timeout] || 30
@open_timeout = args[:open_timeout] || 30
Ответ 5
У меня похожие проблемы. Быстрое погружение в источник раскрывает эту недружелюбие:
def self.post(url, payload, headers={}, &block)
Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block)
end
Если я что-то не хватает, параметры тайм-аута не передаются базовому запросу. Время для патча...
Ответ 6
RestClient:: Resource.new() позволяет установить: timeout и: open_timeout значения, которые будут переданы методу Request.execute, когда вы используете методы get, post, put и etc ресурса