Подтвердить что ты не робот

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 

Таким образом, по-видимому, нет причин, по которым это время. Кто-нибудь знает, есть ли параметр таймаута, который я неправильно устанавливаю?

Спасибо

4b9b3361

Ответ 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 ресурса