web-dev-qa-db-fra.com

Comment obtenir un corps de réponse en utilisant HttpURLConnection, lorsqu'un code autre que 2xx est renvoyé?

J'ai un problème avec la récupération de la réponse Json au cas où le serveur renvoie une erreur. Voir les détails ci-dessous.

Comment j'exécute la demande

J'utilise Java.net.HttpURLConnection. Je configure les propriétés de la requête, puis je fais:

conn = (HttpURLConnection) url.openConnection();

Après cela, quand la requête est réussie, je reçois une réponse Json:

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
  sb.append(output);
}
return sb.toString();

... et le problème est:

Je ne peux pas récupérer les fichiers Json reçus lorsque le serveur renvoie une erreur telle que 50x ou 40x. La ligne suivante lève IOException:

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws Java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com

Le serveur envoie le corps à coup sûr, je le vois dans l'outil externe Burp Suite:

HTTP/1.1 401 Unauthorized

{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}

Je peux obtenir un message de réponse ("Erreur de serveur interne") et un code ("500") en utilisant les méthodes suivantes:

conn.getResponseMessage();
conn.getResponseCode();

Mais je ne peux pas récupérer le corps de la demande ... Peut-être y a-t-il une méthode que je n'ai pas remarquée dans la bibliothèque?

79
kiedysktos

Si le code de réponse n'est pas 200 ou 2xx, utilisez getErrorStream() au lieu de getInputStream()..

117
user207421

Pour clarifier les choses, voici mon code de travail:

if (200 <= conn.getResponseCode() && conn.getResponseCode() <= 299) {
    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}
57
kiedysktos