2014-05-13 9 views
5

Ich versuche, den Körper einer 400 Antwort mit dem rest-client Juwel zu lesen. Das Problem ist, dass rest-client auf 400 reagiert, indem es es als ein Fehler wirft, so kann ich keine Möglichkeit herausfinden, den Text zu erhalten.Den Körper einer 400 Antwort lesen?

Hier ist das motivierende Beispiel. Betrachten wir diesen Aufruf an die Facebook Graph API:

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

Wenn die access_token abgelaufen oder ungültig ist, Facebook macht zwei Dinge:

  1. Gibt eine 400 Bad Request HTTP-Antwort
  2. Returns JSON in der Antwort Körper mit mehr Informationen, wie folgt aus:
{ 
    "error": { 
     "message": "The access token could not be decrypted", 
     "type": "OAuthException", 
     "code": 190 
    } 
} 

Weil 400 Antwort einen Fehler auslöst, kann ich nicht herausfinden, wie man den Körper der Antwort erhält. Das heißt, wenn ich zum Beispiel die GET-Anfrage oben in curl oder in meinem Browser abspiele, kann ich den Body sehen, aber ich kann nicht herausfinden, wie ich ihn im Restclient aufrufen kann. Hier ein Beispiel:

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 

Antwort

13

Von rest-client documentation:

Ausnahmen

für andere Fälle, ein RestClient :: Exception die Antwort halten wird angehoben werden;

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) 

Oder nur RestClient::Exception#http_body verwenden, um den Antworttext aus der Ausnahme zu bekommen: eine spezifische Ausnahmeklasse wird für bekannten Fehlercodes

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

Sie Ihren Code neu schreiben können wie geworfen werden. (Es ist nur eine Abkürzung).