web-dev-qa-db-ja.com

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 

したがって、これがタイムアウトになる理由はないようです。私が正しく設定していないタイムアウトパラメータがあるかどうか誰かが知っていますか?

ありがとう

18
earnold

この構文は、タイムアウトを要求ヘッダーとして設定します(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

21
phlipper

ドキュメントを見ると、RestClient.executeタイムアウトパラメータを介して-1を渡すことができます。

# * :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>}
13
clemensp

私は次のコードを使用しており、Richardが指摘したように魅力のように機能します

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

response = resource.get  :params => { ..... }
4
Lu Tahmazyan

私はすでにRestClient.getとRestClient.postを広範囲に使用しているので、私にとっては「モンキーパッチ」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

RestClient :: Resource.new()を使用すると、リソースのget、post、putなどのメソッドを使用するときに、Request.executeメソッドに渡される:timeout値と:open_timeout値を設定できます。

2

同様の問題が発生しています。ソースをざっと見てみると、このちょっとした不親切さがわかります。

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

何かが足りない場合を除いて、タイムアウトオプションは基になるリクエストに渡されません。パッチの時間...

2
Mike Davis