2010-12-14 16 views
15

J'essaie d'utiliser ruby ​​rest-client pour télécharger un grand nombre d'images sur un site que j'écris. Mon code ressemble:ruby ​​rest-client: ne le faites jamais attendre?

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

Cependant, je reçois cette erreur:

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/ 

Mais quand je regarde le journal du serveur

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

Donc, il ne semble pas être n'importe quelle raison pour laquelle cela expire. Quelqu'un at-il une idée s'il y a un paramètre de délai que je ne suis pas en train de régler correctement?

Merci

Répondre

2

Je rencontre des problèmes similaires. Une plongée rapide dans la source révèle ce bit de unfriendliness:

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

À moins que je me manque quelque chose, les options de délai d'attente ne sont pas transmises à la demande sous-jacente. Le temps d'un patch ...

+4

Une plongée peu profonde montre que si les 'GET',' Post' et connexes des méthodes pratiques font en effet vous permettre de ne pas passer les options ': timeout' et': open_timout', ce sont juste des wrappers fins pour 'Request.execute', qui les acceptera.Mieux vaut remplacer les appels aux wrappers par des appels à 'execute' que par patch singe, à mon humble avis. –

19

Cette syntaxe définit le délai d'attente en-tête de requête (voir la signature RestClient.post), si vous souhaitez utiliser le paramètre de délai d'attente, vous devez utiliser:

RestClient::Request.execute(:method => :post, :url => @url, :timeout => 90000000) 

voir: https://github.com/rest-client/rest-client/blob/master/lib/restclient/request.rb#L12

+1

quelle est la demande? constante non initialisée –

+2

RestClient :: Request.execute (: méthode =>: post,: url => @url,: timeout => 90000000) –

+1

Et mettre tous les paramètres à envoyer dans le corps POST (je pense ': file_param' dans l'OP) en ': payload':' Request.execute (: méthode =>: poste,: url => @url,: timeout => 90000000,: payload => {: fichier_param => fichier_obj}) ' – WiseOldDuck

2

le RESTClient :: Resource.new() vous permet de définir: délai d'attente et: open_timeout valeurs qui sont transmis à la méthode Request.execute, lorsque vous utilisez le get de la ressource, après, mettre, méthodes etc

4

J'ai utilisé le code suivant et fonctionne comme un ch bras comme l'a souligné Richard

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

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

En regardant les documents, vous pouvez passer -1 à délai d'attente RestClient.execute param:

# * :timeout and :open_timeout passing in -1 will disable the timeout by setting the corresponding net timeout values to nil 

Il peut être utilisé comme suit:

resource = RestClient::Resource.new(
    "url", 
    :timeout => -1, 
    :open_timeout => -1 
response = resource.get :params => {<params>} 
+3

Ceci apparaît avoir été mis à jour à «nil» plutôt que -1. L'utilisation de -1 enregistre un avertissement (mais semble fonctionner). – WiseOldDuck

3

J'utilise déjà beaucoup RestClient.get et RestClient.post, donc pour moi, il était plus facile de 'Monkey Patch' RestClient. Je recommande d'utiliser RestClient::Resource.new ou RestClient::Request.Execute si possible.

Cependant, comme je suis fainéant, et que je ne veux pas échanger toutes les occurrences de RestClient.get/RestClient.post dans mon code, j'ai décidé de prendre un raccourci.

$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 

Et que je viens juste rapidement remplacé RestClient.get/poste avec RestClient2.get/poste.

Ce serait bien, si RestClient::Request avait un délai d'attente par défaut spécifié, comme:

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