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
したがって、これがタイムアウトになる理由はないようです。私が正しく設定していないタイムアウトパラメータがあるかどうか誰かが知っていますか?
ありがとう
この構文は、タイムアウトを要求ヘッダーとして設定します(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
ドキュメントを見ると、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>}
私は次のコードを使用しており、Richardが指摘したように魅力のように機能します
resource = RestClient::Resource.new "url",
:timeout => $TIMEOUT,
:open_timeout => $OPEN_TIMEOUT
response = resource.get :params => { ..... }
私はすでに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
RestClient :: Resource.new()を使用すると、リソースのget、post、putなどのメソッドを使用するときに、Request.executeメソッドに渡される:timeout値と:open_timeout値を設定できます。
同様の問題が発生しています。ソースをざっと見てみると、このちょっとした不親切さがわかります。
def self.post(url, payload, headers={}, &block)
Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block)
end
何かが足りない場合を除いて、タイムアウトオプションは基になるリクエストに渡されません。パッチの時間...