2012-07-10 38 views
34

Hace poco cambié de Ruby's Net: clase HTTP a rest-client 1.6.7.Cómo manejar excepciones con Ruby Rest-Client

Me resulta mucho más fácil formular solicitudes, pero a diferencia de Net: solicitud de HTTP, cuando el cliente de reposo obtiene algo distinto de 200, la solicitud fallece. Intenté poner un punto de interrupción directamente después del RestClient.get, y nunca se golpea, así que estoy haciendo algo 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 

lo que se traduce en este 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' 

¿Puede alguien decirme cómo evaluar correctamente el código de respuesta y mantener esta excepción suceda ...?

Respuesta

49

Véase sección excepciones en http://rubydoc.info/gems/rest-client/

  • para el código de resultados entre 200 y 207 un RESTClient :: Respuesta será devuelto
  • para el código de resultados 301, 302 o 307 de la redirección se seguirá si el request es un get o un encabezado
  • para el código de resultado 303 se seguirá la redirección y la solicitud se transformará en un obtener
  • para otros casos a RestClient :: Exception holding the Respon sí será levantado, una clase de excepción específica será lanzada para los códigos de error conocimientos

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

También en la misma documentación @wich señaló, se puede pasar de un bloque a RestClient.get tal que no va a lanzar una excepción en los códigos de respuesta no 200:

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

Consulte la sección "Manejo de Resultado": http://www.rubydoc.info/gems/rest-client/1.6.7/frames#Result_handling

3
rescue RestClient::ExceptionWithResponse => err 
Cuestiones relacionadas