2012-07-10 1 views
34

Je suis récemment passé de Ruby's Net: HTTP à rest-client 1.6.7.Comment gérer les exceptions avec Ruby Rest-Client

Je trouve beaucoup plus facile de former des requêtes, mais contrairement à la requête Net: HTTP, quand rest-client reçoit autre chose qu'un 200, la requête meurt. J'ai essayé de mettre un point d'arrêt directement après le RestClient.get, et il ne se fait jamais toucher - donc je fais quelque chose de mal.

def get_member_using_card 
    resource = "#{@settings_app_uri}api/v1/card/#{self.member_card_num}?token=#{@settings.api_key}" 
    response = RestClient.get resource 
    if response.code == 200 
    card = JSON.parse(response.body) 
    self.customer_id = card['card']['customer_id'] 
    else 
    return 0 
    end 
end 

Quels sont les résultats de cette stacktrace:

RestClient::ResourceNotFound - 404 Resource Not Found: 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/abstr 
act_response.rb:48:in `return!' 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque 
st.rb:230:in `process_result' 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque 
st.rb:178:in `block in transmit' 
     /Users/tim/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/net/http.rb:627:in `start' 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque 
st.rb:172:in `transmit' 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque 
st.rb:64:in `execute' 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient/reque 
st.rb:33:in `execute' 
     /Users/tim/.rvm/gems/ruby-1.9.2-p290/gems/rest-client-1.6.7/lib/restclient.rb:68 
:in `get' 

Quelqu'un peut-il me dire comment évaluer correctement le code de réponse et de garder cette exception qui se passe ...?

Répondre

49

Voir rubrique Exceptions sur http://rubydoc.info/gems/rest-client/

  • pour le code de résultats entre 200 et 207 un RESTClient :: réponse sera retourné
  • pour les résultats du code 301, 302 ou 307 la redirection sera suivie si la demande est un get ou une tête
  • pour le code de résultat 303 la redirection sera suivie et la demande transformée en get
  • pour les autres cas un RestClient :: Exception contenant le Respon se sera élevé, une classe d'exception spécifique sera lancée pour les codes d'erreur savoir

RestClient.get 'http://example.com/resource' 
➔ RestClient::ResourceNotFound: RestClient::ResourceNotFound` 

begin 
    RestClient.get 'http://example.com/resource' 
rescue => e 
    e.response 
end 
➔ 404 Resource Not Found | text/html 282 bytes 
17

également dans la même documentation @wich a, vous pouvez passer un bloc à RestClient.get tel qu'il ne lèvera une exception sur les codes de réponse non-200:

# Don't raise exceptions but return the response 
RestClient.get('http://example.com/resource'){|response, request, result| response } 

Voir la section "Gestion des résultats": http://www.rubydoc.info/gems/rest-client/1.6.7/frames#Result_handling

3
rescue RestClient::ExceptionWithResponse => err 
Questions connexes