18

私はrubyrest -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 

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

ありがとう

4

6 に答える 6

22

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

于 2011-03-26T21:23:41.083 に答える
14

ドキュメントを見ると、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>}
于 2012-07-25T21:07:56.800 に答える
4

私はすでに RestClient.get と RestClient.post を広範囲に使用しているので、RestClient を「モンキー パッチ」する方が簡単でした。可能であればRestClient::Resource.neworを使用することをお勧めします。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
于 2013-04-01T03:13:23.373 に答える
4

次のコードを使用しましたが、リチャードが指摘したように魅力的です

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

response = resource.get  :params => { ..... }
于 2012-03-03T02:40:26.563 に答える
3

私は同様の問題を抱えています。ソースにざっと飛び込むと、このちょっとした不親切さが明らかになります。

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

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

于 2011-01-13T23:00:51.273 に答える
2

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

于 2011-11-12T13:16:11.557 に答える