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 

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

谢谢

如果要使用必须使用的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

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

我使用了以下代码,就像理查德指出的魅力一样

 resource = RestClient::Resource.new "url", :timeout => $TIMEOUT, :open_timeout => $OPEN_TIMEOUT response = resource.get :params => { ..... } 

我已经广泛使用了RestClient.get和RestClient.post,所以对我来说,“Monkey Patch”RestClient更容易。 如果可能的话,我建议使用RestClient::Resource.newRestClient::Request.Execute

但是,由于我很懒,并且不想在我的代码RestClient.post每次出现的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快速替换了RestClient2.get / post。

如果RestClient::Request具有指定的默认超时,那将是很好的,例如:

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

我有类似的问题。 快速浏览消息来源,可以看出这种不友好之处:

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

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

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