web-dev-qa-db-fra.com

Comment gérer les exceptions avec Ruby Rest-Client

Je suis récemment passé de Ruby's Net: HTTP class à rest-client 1.6.7.

Je trouve qu'il est beaucoup plus facile de formuler des requêtes, mais contrairement à Net: Requête HTTP, lorsque rest-client obtient autre chose qu'un 200, la requête meurt. J'ai essayé de placer un point d'arrêt directement après le fichier RestClient.get, et il ne se fait jamais toucher - je fais donc 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

Ce qui aboutit à cette pile:

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 éviter que cette exception se produise ...?

36
tpow

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

  • pour les résultats compris entre 200 et 207, RestClient :: Response sera renvoyé
  • pour les codes de résultats 301, 302 ou 307, la redirection sera suivie si la requête est une requête get ou une entête
  • pour le code de résultat 303, la redirection sera suivie et la demande transformée en get
  • pour les autres cas, une RestClient :: Exception contenant la réponse sera levée, une classe d'exception spécifique sera levée pour les codes d'erreur connus

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
51
wich

Toujours dans la même documentation pointée par @wich, vous pouvez transmettre un bloc à RestClient.get, de sorte qu'il ne lève pas d'exception pour 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/frame#Result_handling

19
Raphael
rescue RestClient::ExceptionWithResponse => err
3
Serhiy Nazarov

Plusieurs erreurs peuvent survenir, des types d'exception spécifiques tels que Errno :: EHOSTUNREACH ou le plus générique ExceptionWithResponse. Consultez le readme pour plus d'informations.

0
MegaTux