Wie erhalte ich den Antworttext mit HttpURLConnection, wenn ein anderer Code als 2xx zurückgegeben wird?

Lesezeit: 2 Minuten

Benutzer-Avatar
kiedysktos

Ich habe ein Problem mit dem Abrufen der Json-Antwort, falls der Server einen Fehler zurückgibt. Einzelheiten siehe unten.

Wie ich die Anfrage durchführe

ich benutze java.net.HttpURLConnection. Ich richte Anforderungseigenschaften ein, dann tue ich:

conn = (HttpURLConnection) url.openConnection();

Danach, wenn die Anfrage erfolgreich ist, bekomme ich 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 den empfangenen Json nicht abrufen, wenn der Server einen Fehler wie 50x oder 40x zurückgibt. Folgende Zeile löst 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 mit Sicherheit Body, 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 (z. B. „Internal Server Error“) und einen Code (z. B. „500“) mit den folgenden Methoden erhalten:

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

Aber ich kann den Anforderungstext nicht abrufen … vielleicht gibt es eine Methode, die ich in der Bibliothek nicht bemerkt habe?

Benutzer-Avatar
Benutzer207421

Wenn der Antwortcode nicht 200 oder 2xx ist, verwenden Sie getErrorStream() anstatt getInputStream().

  • In meinem Fall gibt getErrorStream() mit dem Antwortcode 403 null zurück

    – Schluck

    10. April 2018 um 14:35 Uhr

Benutzer-Avatar
kiedysktos

Bei Fehlern wurde die falsche Methode verwendet, hier ist der Arbeitscode:

BufferedReader br = null;
if (100 <= conn.getResponseCode() && conn.getResponseCode() <= 399) {
    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
} else {
    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
}

  • HttpURLConnection.getErrorStream() (sun.net.www.protocol.http Implementierung) zurück null wenn nicht responseCode >= 400also ist Ihre Überprüfung auf 299 wahrscheinlich falsch.

    – vladr

    16. März 2018 um 14:46 Uhr

  • Wenn Sie Java 8 verwenden, können Sie die Antwort als String erhalten. String responseBody = br.lines().collect(Collectors.joining());

    – Lanil Marasinghe

    17. April 2019 um 16:56 Uhr


  • Der korrekte Bereich liegt zwischen 200 und 399, da 3xx ein „Umleitungs“-Status und kein Fehler ist.

    – luca.vercelli

    5. Juni 2020 um 10:26 Uhr

  • @luca.vercelli Ich denke, es sollte 100..399 sein, weil 100..199 für “informative” Antworten steht, wie in definiert de.wikipedia.org/wiki/…

    – Windreiter

    9. Oktober 2020 um 17:21 Uhr

Benutzer-Avatar
Sharhabeel Hamdan

Dies ist eine einfache Möglichkeit, eine erfolgreiche Antwort vom Server zu erhalten, z. B. ein PHP-Echo, andernfalls eine Fehlermeldung.

BufferedReader br = null;
if (conn.getResponseCode() == 200) {
    br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    String strCurrentLine;
        while ((strCurrentLine = br.readLine()) != null) {
               System.out.println(strCurrentLine);
        }
} else {
    br = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
    String strCurrentLine;
        while ((strCurrentLine = br.readLine()) != null) {
               System.out.println(strCurrentLine);
        }
}

  • das if(...) sollte mehr erfolgreiche Codes überprüfen, und zwar alle 2xx, nicht nur 200

    – Kiedysktos

    30. November 2020 um 20:45 Uhr

1014360cookie-checkWie erhalte ich den Antworttext mit HttpURLConnection, wenn ein anderer Code als 2xx zurückgegeben wird?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy