18

I am trying to use ruby rest-client to upload a large number of images to a site that I'm writing. My code looks like:

RestClient.post url, :timeout => 90000000, :open_timeout => 90000000, :file_param => file_obj

However, I am getting this error:

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/

But when I look at the server log

Completed in 61493ms (View: 2, DB: 1) | 201 Created 

So there doesn't appear to be any reason why this is timing out. Anyone have any idea if there is a timeout param I am not correctly setting?

Thanks

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.neworRestClient::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

而且我只是用 /post 快速替换了 RestClient.get/ RestClient2.getpost。

如果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

当您使用资源的 get、post、put 等方法时,RestClient::Resource.new() 允许您设置将传递给 Request.execute 方法的 :timeout 和 :open_timeout 值

于 2011-11-12T13:16:11.557 回答