2014-05-13 19 views
5

Sto provando a leggere il corpo di una risposta 400 con la gemma rest-client. Il problema è che rest-client risponde a 400 lanciandolo come errore, quindi non riesco a trovare un modo per ottenere il corpo del testo.Leggere il corpo di una risposta 400?

Ecco l'esempio motivante. Considerate questo chiamata all'API grafico di facebook:

JSON.parse(RestClient.get("https://graph.facebook.com/me?fields=id,email,first_name,last_name&access_token=#{access_token}")) 

Se il access_token è scaduto o non valida, facebook fa due cose:

  1. restituisce una risposta HTTP 400 Richiesta
  2. Restituisce JSON nella risposta corpo con più informazioni, in questo modo:
{ 
    "error": { 
     "message": "The access token could not be decrypted", 
     "type": "OAuthException", 
     "code": 190 
    } 
} 

Poiché la risposta 400 genera un errore, non riesco a capire come ottenere il corpo della risposta. Cioè, ad esempio, se eseguo la richiesta GET sopra in curl o nel mio browser, posso vedere il corpo, ma non riesco a capire come accedervi nel restclient. Ecco un esempio:

begin 
    fb_response = JSON.parse(RestClient.get("https://graph.facebook.com/me?fields=id,email,first_name,last_name&access_token=#{access_token}")) 
rescue => e 
    # 400 response puts me here 
    # How can I get the body of the above response now, so I can get details on the error? 
    # eg, was it an expired token? A malformed token? Something else? 
end 

risposta

13

Da rest-client documentation:

eccezioni

per altri casi, un RestClient :: Exception tenendo la risposta sarà sollevato; una classe di eccezione specifica sarà gettato per i codici di errore noti

begin 
    RestClient.get 'http://example.com/resource' 
rescue => e 
    e.response 
end 

È possibile riscrivere il codice come:

body = begin 
    RestClient.get("https://graph.facebook.com/me?fields=id,email,first_name,last_name&access_token=#{access_token}") 
rescue => e 
    e.response.body 
end 
fb_response = JSON.parse(body) 

o semplicemente usare RestClient::Exception#http_body per ottenere il corpo risposta da parte l'eccezione. (È solo una scorciatoia).

Problemi correlati