2011-10-26 32 views
58

Estoy trabajando en una aplicación Rails utilizando HTTParty para realizar solicitudes HTTP. ¿Cómo puedo manejar los errores de HTTP con HTTParty? Específicamente, necesito atrapar HTTP 502 & 503 y otros errores, como errores de rechazo de conexión y tiempo de espera.¿Cómo puedo manejar los errores con HTTParty?

Respuesta

76

Una instancia de HTTParty::Response tiene un atributo code que contiene el código de estado de la respuesta HTTP. Se da como un entero. Por lo tanto, algo como esto:

response = HTTParty.get('http://twitter.com/statuses/public_timeline.json') 

case response.code 
    when 200 
    puts "All good!" 
    when 404 
    puts "O noes not found!" 
    when 500...600 
    puts "ZOMG ERROR #{response.code}" 
end 
+0

¡Gracias! Eso es lo que estaba planeando hacer. Me preguntaba si había alguna otra manera de manejar el error. – preethinarayan

+36

Esta respuesta no aborda las fallas de conexión. – gtd

+2

En cuanto al comentario de preethinarayan, si quiere capturar/rescatar los errores en su lugar, siempre puede hacer algo como: raise blablahblah if response.code! = 200 De hecho, haré algo similar ... – user435779

20

Esta respuesta se dirige a fallos en la conexión. Si no se encuentra una URL, el código de estado no lo ayudará. Rescatar de esta manera:

begin 
    HTTParty.get('http://google.com') 
rescue HTTParty::Error 
    # don´t do anything/whatever 
rescue StandardError 
    # rescue instances of StandardError, 
    # i.e. Timeout::Error, SocketError etc 
end 

Para más información ver: this github issue

+8

Nunca atrapes todo. Debes atrapar la clase base de error de 'HTTParty'. – Oleander

+0

Quizás la idea es detectar errores en el código de HTTParty. HTTParty podría generar errores que no son 'HTTParty :: Errors'. –

+1

Si no hay una red en absoluto, obtengo un 'SocketError', algo a tener en cuenta. Puede intentar desconectar su cable de ethernet para ver que esto suceda. – Kris

9

También puede utilizar estos métodos predicados prácticos como success? o bad_gateway? de esta manera:

response = HTTParty.post(uri, options) 
p response.success? 

lista completa de posibles respuestas se puede encontrar bajo Net::HTTPResponse::CODE_TO_OBJ constante.

Cuestiones relacionadas