Как получить тело ответа с помощью HttpURLConnection, когда возвращается код, отличный от 2xx?


у меня есть проблема с получением ответа Json в случае, если сервер возвращает ошибку. Смотрите подробности ниже.

как я выполняю запрос

Я использую java.net.HttpURLConnection. Я устанавливаю свойства запроса, затем я делаю:

conn = (HttpURLConnection) url.openConnection();

после этого, когда запрос успешен, я получаю ответ Json:

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

... и проблема заключается в следующем:

Я не могу получить JSON, полученный, когда сервер возвращает некоторую ошибку, такую как 50x или 40x,. Следующие броски строки IOException:

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

сервер отправляет тело наверняка, я вижу его в external tool Burp Suite:

HTTP/1.1 401 Unauthorized

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

Я могу получить ответное сообщение (т. е. "внутренняя ошибка сервера") и код (т. е. "500"), используя следующие методы:

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

но я не могу получить тело запроса... может быть, есть какой-то метод, который я не заметил в библиотеке?

2 63

2 ответа:

Если код ответа не 200 или 2xx, используйте getErrorStream() вместо getInputStream().

чтобы сделать вещи кристально чистые, вот мой рабочий код:

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