Подтвердить что ты не робот

Как получить тело ответа с использованием 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

Сервер отправляет тело точно, я вижу его во внешнем инструменте 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();

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

4b9b3361

Ответ 1

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

Ответ 2

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

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