ruby rest-client: никогда не делать тайм-аут? - PullRequest
17 голосов
/ 14 декабря 2010

Я пытаюсь использовать 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 

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

Спасибо

Ответы [ 6 ]

20 голосов
/ 27 марта 2011

Этот синтаксис устанавливает время ожидания в качестве заголовка запроса (см. Сигнатуру 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

12 голосов
/ 26 июля 2012

Глядя на документы, вы можете передать -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>}
4 голосов
/ 01 апреля 2013

Я уже широко использую 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
4 голосов
/ 03 марта 2012

Я использовал следующий код и работает как брелок, на что указывает Ричард

resource = RestClient::Resource.new "url", 
                                    :timeout => $TIMEOUT, 
                                    :open_timeout => $OPEN_TIMEOUT

response = resource.get  :params => { ..... }
2 голосов
/ 12 ноября 2011

RestClient :: Resource.new () позволяет вам установить значения: timeout и: open_timeout, которые будут переданы методу Request.execute, когда вы используете методы get, post, put и т. Д. Ресурса

2 голосов
/ 14 января 2011

У меня похожие проблемы. Быстрое погружение в источник показывает немного недружелюбия:

def self.post(url, payload, headers={}, &block)
  Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block)
end

Если я что-то не упустил, параметры тайм-аута не передаются базовому запросу. Время для патча ...

...