Чтение тела ответа на ошибку в Java

В Java этот код генерирует исключение, когда результат HTTP равен 404:

URL url = new URL("http://stackoverflow.com/asdf404notfound"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.getInputStream(); // throws! 

В моем случае, я знаю, что содержание 404, но я все равно хотел бы прочитать тело ответа в любом случае.

(В моем случае код ответа равен 403, но тело ответа объясняет причину отклонения, и я хотел бы отобразить это для пользователя.)

Как я могу получить доступ к органу реагирования?

Вот отчет об ошибке (закрыть, не исправить, а не ошибка).

Их совет заключается в следующем:

 HttpURLConnection httpConn = (HttpURLConnection)_urlConnection; InputStream _is; if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) { _is = httpConn.getInputStream(); } else { /* error from server */ _is = httpConn.getErrorStream(); } 

Это та же проблема, с которой я HttpUrlConnection : HttpUrlConnection возвращает HttpUrlConnection если вы попытаетесь прочитать getInputStream() из соединения.
Вместо этого вы должны использовать getErrorStream() когда код состояния превышает 400.

Более того, будьте осторожны, потому что не только 200 – код статуса успеха, даже 201, 204 и т. Д. Часто используются как статусы успеха.

Вот пример того, как я пошел, чтобы справиться с этим

 ... connection code code code ... // Get the response code int statusCode = connection.getResponseCode(); InputStream is = null; if (statusCode >= 200 && statusCode < 400) { // Create an InputStream in order to extract the response object is = connection.getInputStream(); } else { is = connection.getErrorStream(); } ... callback/response to your handler.... 

Таким образом, вы сможете получить необходимый ответ как в случае успеха, так и в случае ошибок.

Надеюсь это поможет!

В .Net у вас есть свойство Response для WebException, которое дает доступ к streamу в качестве исключения. Поэтому я думаю, что это хороший способ для Java, …

 private InputStream dispatch(HttpURLConnection http) throws Exception { try { return http.getInputStream(); } catch(Exception ex) { return http.getErrorStream(); } } 

Или реализация, которую я использовал. (Могут потребоваться изменения для кодирования или другие вещи. Работает в текущей среде.)

 private String dispatch(HttpURLConnection http) throws Exception { try { return readStream(http.getInputStream()); } catch(Exception ex) { readAndThrowError(http); return null; // <- never gets here, previous statement throws an error } } private void readAndThrowError(HttpURLConnection http) throws Exception { if (http.getContentLengthLong() > 0 && http.getContentType().contains("application/json")) { String json = this.readStream(http.getErrorStream()); Object oson = this.mapper.readValue(json, Object.class); json = this.mapper.writer().withDefaultPrettyPrinter().writeValueAsString(oson); throw new IllegalStateException(http.getResponseCode() + " " + http.getResponseMessage() + "\n" + json); } else { throw new IllegalStateException(http.getResponseCode() + " " + http.getResponseMessage()); } } private String readStream(InputStream stream) throws Exception { StringBuilder builder = new StringBuilder(); try (BufferedReader in = new BufferedReader(new InputStreamReader(stream))) { String line; while ((line = in.readLine()) != null) { builder.append(line); // + "\r\n"(no need, json has no line breaks!) } in.close(); } System.out.println("JSON: " + builder.toString()); return builder.toString(); } 

Я знаю, что это напрямую не отвечает на вопрос, но вместо использования библиотеки HTTP-соединений, предоставляемой Sun, вы можете взглянуть на Commons HttpClient , который (на мой взгляд) имеет гораздо более простой API для работы.

Сначала проверьте код ответа, а затем используйте HttpURLConnection.getErrorStream()

 InputStream is = null; if (httpConn.getResponseCode() !=200) { is = httpConn.getErrorStream(); } else { /* error from server */ is = httpConn.getInputStream(); } 
  • Совместное использование ресурсов с использованием Spring Security
  • Если утверждение с сопоставлением строк не выполняется
  • Как работает сериализация Java и когда она должна использоваться вместо какой-либо другой техники сохранения?
  • Разбор JSON с GSON, объект иногда содержит список, иногда содержащий объект
  • Создание случайных чисел без дубликатов
  • Чтение текстового файла в Java
  • Как сохранить и получить изображение на моем сервере в java webapp
  • В чем смысл алмазного оператора в Java 7?
  • Конечная локальная переменная не может быть назначена
  • как добиться сцепления метода в java?
  • Может ли Spring Security использовать @PreAuthorize для методов весенних controllerов?
  • Interesting Posts

    Как вертикально центрировать div для всех браузеров?

    admob получать ответ объявления. ErrorCode: 0 Не удалось загрузить объявление: 0

    Как мне управлять зависимостями между проектами в рабочей области Xcode?

    WebMatrix / IIS Express работает только с Opera!

    Действительные символы в имени classа Java

    Пытается использовать переменные в качестве значений vba для sql

    Использование JQuery Validate Plugin для проверки нескольких полей формы с одинаковыми именами

    Связывание со статическим свойством

    Как включить идентификационную строку для репозитория Git?

    Android Преобразование Px в Dp (соотношение сторон видео)

    Что это за цилиндр на кабелях?

    Как настроить систему для использования репозитория FIWARE yum?

    Как использовать class Timer для вызова метода, сделать что-то, сбросить таймер, повторить?

    Создание пользовательского JButton в Java

    Вычисление и сохранение пространства в PostgreSQL

    Давайте будем гением компьютера.