Ich habe ein Problem beim Abrufen der Json-Antwort, falls der Server einen Fehler zurückgibt. Siehe Details unten.
Wie ich die Anfrage durchführe
Ich benutze java.net.HttpURLConnection
. Ich richte die Anforderungseigenschaften ein und mache dann:
conn = (HttpURLConnection) url.openConnection();
Danach, wenn die Anfrage erfolgreich ist, erhalte ich die Antwort Json:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
sb.append(output);
}
return sb.toString();
... und das Problem ist:
Ich kann Json nicht abrufen, wenn der Server einen Fehler wie 50x oder 40x zurückgibt. Die folgende Zeile löst eine IOException aus:
br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com
Der Server sendet sicher Text, ich sehe es im externen Tool Burp Suite:
HTTP/1.1 401 Unauthorized
{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}
Ich kann eine Antwortnachricht (dh "Interner Serverfehler") und Code (dh "500") mit den folgenden Methoden erhalten:
conn.getResponseMessage();
conn.getResponseCode();
Aber ich kann den Anfragetext nicht abrufen ... Vielleicht gibt es eine Methode, die ich in der Bibliothek nicht bemerkt habe?
quelle
Um die Dinge kristallklar zu machen, hier ist mein Arbeitscode:
quelle
HttpURLConnection.getErrorStream()
(sun.net.www.protocol.http
Implementierung) wird zurückgegeben, esnull
sei dennresponseCode >= 400
, Ihre Prüfung auf 299 ist wahrscheinlich falsch.String responseBody = br.lines().collect(Collectors.joining());
Dies ist eine einfache Möglichkeit, eine erfolgreiche Antwort vom Server zu erhalten, z. B. PHP-Echo, andernfalls eine Fehlermeldung.
quelle