rails - faraday post ruby
Cómo manejar excepciones con Ruby Rest-Client (4)
Hay varios errores que pueden suceder, tipos de excepción específicos como Errno :: EHOSTUNREACH o el ExceptionWithResponse más genérico. Verifique el archivo léame para más información.
Recientemente cambié de Ruby''s Net: clase HTTP a rest-client 1.6.7.
Me resulta mucho más fácil formular solicitudes, pero a diferencia de Net: solicitud de HTTP, cuando rest-client 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 resulta en esta 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 evitar que esta excepción ocurra ...?
También en la misma documentación a la que señaló @wich, puede pasar un bloque a RestClient.get de modo que no genere una excepción en códigos de respuesta que no sean 200:
# Don''t raise exceptions but return the response
RestClient.get(''http://example.com/resource''){|response, request, result| response }
Consulte la sección "Gestión de resultados": http://www.rubydoc.info/gems/rest-client/1.6.7/frames#Result_handling
Ver encabezado Excepciones en http://rubydoc.info/gems/rest-client/
- para el código de resultados entre 200 y 207, se devolverá un RestClient :: Response
- para los resultados del código 301, 302 o 307 se seguirá la redirección si la solicitud es un get o un head
- para el código de resultado 303 se seguirá la redirección y la solicitud se transformará en un get
- para otros casos se generará una RestClient :: Exception que contiene la respuesta, se lanzará una clase de excepción específica para conocer los códigos de error
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
rescue RestClient::ExceptionWithResponse => err