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.
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();
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?
Si le code de réponse n'est pas 200 ou 2xx, utilisez getErrorStream()
au lieu de getInputStream().
.
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()));
}