2012-07-10 6 views
34

Ich wechselte vor kurzem von Rubys Net: HTTP-Klasse zu Rest-Client 1.6.7.So behandeln Sie Ausnahmen mit Ruby Rest-Client

Ich finde es viel einfacher zu Anfragen, aber im Gegensatz zu Net: HTTP-Anfrage, wenn Rest-Client etwas anderes als eine 200 bekommt, stirbt die Anfrage. Ich habe versucht, einen Breakpoint direkt nach dem RestClient.get zu setzen, und es wird nie getroffen - also mache ich etwas falsch.

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 

die in diesem stacktrace Ergebnisse:

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' 

jemand kann mir sagen, wie man richtig den Antwortcode zu bewerten und diese Ausnahme halten passiert ...?

Antwort

49

Siehe Punkt Ausnahmen auf http://rubydoc.info/gems/rest-client/

  • für Ergebnisse Code zwischen 200 und 207 eine RestClient :: Antwort wird
  • für Ergebnisse Code 301, 302 oder 307 zurückgegeben wird, wird die Umleitung gefolgt werden, wenn die Anfrage ist ein erhalten oder ein Kopf
  • für den Ergebniscode 303 die Umleitung wird gefolgt und die Anfrage in eine get umgewandelt werden
  • für andere Fälle eine RestClient :: Exception mit der Antwort se wird erhöht, eine spezifische Ausnahmeklasse werden für Know-Fehlercodes

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

Auch in der gleichen Dokumentation geworfen werden @wich zu spitz, ein Block so RestClient.get passieren kann, dass es keine Ausnahme auf nicht-200 Antwortcodes werfen:

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

Siehe Abschnitt des "Ergebnis Handling": http://www.rubydoc.info/gems/rest-client/1.6.7/frames#Result_handling

3
rescue RestClient::ExceptionWithResponse => err 
Verwandte Themen