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, lorsque la demande est réussie, j'obtiens la 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 Json reçu lorsque le serveur renvoie une erreur comme 50x ou 40x ,. La ligne suivante lance 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 (c'est-à-dire "Erreur interne du serveur") et un code (c'est-à-dire "500") en utilisant les méthodes suivantes:
conn.getResponseMessage();
conn.getResponseCode();
Mais je ne peux pas récupérer le corps de la requête ... peut-être qu'il y a une méthode que je n'ai pas remarquée dans la bibliothèque?
la source
Pour clarifier les choses, voici mon code de travail:
la source
HttpURLConnection.getErrorStream()
(sun.net.www.protocol.http
implémentation) retourne ànull
moinsresponseCode >= 400
, donc votre chèque pour 299 est probablement incorrect.String responseBody = br.lines().collect(Collectors.joining());
C'est un moyen facile d'obtenir une réponse réussie du serveur comme PHP echo sinon un message d'erreur.
la source