ruby rest-client:永远不会超时?

时间:2010-12-14 03:11:45

标签: ruby-on-rails 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 

所以似乎没有任何理由说明这是超时的。任何人都知道如果有超时参数我没有正确设置?

由于

6 个答案:

答案 0 :(得分:19)

如果要使用必须使用的timeout参数,此语法将超时设置为请求标头(请参阅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

答案 1 :(得分:12)

查看文档,您可以通过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>}

答案 2 :(得分:4)

我使用了以下代码,并且像Richard一样指出了魅力

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

response = resource.get  :params => { ..... }

答案 3 :(得分:3)

我已经广泛使用了RestClient.get和RestClient.post,所以对我来说,更容易使用Monkey Patch&#39; RESTClient实现。如果可能,我建议您使用RestClient::Resource.newRestClient::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

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

如果RestClient::Request指定了默认超时,那就太好了,例如:

  @timeout = args[:timeout] || 30
  @open_timeout = args[:open_timeout] || 30

答案 4 :(得分:2)

我遇到了类似的问题。快速浏览消息来源可以看出这一点不友好:

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

除非我遗漏了某些内容,否则超时选项不会传递给基础请求。补丁的时间......

答案 5 :(得分:2)

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