Как получить код состояния HTTP и тело ответа при вызове RestClientException?

Методы RestTemplate, такие как postForEntity() throw RestClientException. Я хотел бы извлечь код состояния HTTP и тело ответа из этого объекта исключения в блоке catch. Как я могу это сделать?

Ответ 1

Вместо того, чтобы ловить RestClientException, поймайте специальный HttpClientErrorException.

Вот пример:

try {
    Link dataCenterLink = serviceInstance.getLink("dataCenter");
    String dataCenterUrl = dataCenterLink.getHref();
    DataCenterResource dataCenter =
        restTemplate.getForObject(dataCenterUrl, DataCenterResource.class);
    serviceInstance.setDataCenter(dataCenter);
} catch (HttpClientErrorException e) {
    HttpStatus status = e.getStatusCode();
    if (status != HttpStatus.NOT_FOUND) { throw e; }
}

HttpClientErrorException предоставляет getStatusCode и getResponseBodyAsByteArray, чтобы получить код состояния и тело соответственно.

Ответ 2

В некоторых случаях HttpClientErrorException не выбрасывается. Например, следующий метод restTemplate.exchange:

ResponseEntity<Employee[]> employees =  restTemplate.exchange(url, HttpMethod.GET, entity, Employee[].class);

Получите http тело и маршалл для сущности. Если удаленный ресурс возвращает редкую ошибку, внутренний маршал не работает и выдается только RestClientException.

restTemplate.setErrorHandler

В этом случае или если вы хотите обработать любую ошибку в операциях restTemplate, вы можете использовать setErrorHandler. Этот метод получает базовый ResponseErrorHandler с полезными методами.

Этот метод hasError позволил мне получить удаленный основной текст http и помог мне обнаружить ошибку вызова или в удаленном удаленном ресурсе http:

restTemplate.setErrorHandler(new ResponseErrorHandler() {

  @Override
  public boolean hasError(ClientHttpResponse arg0) throws IOException {

    System.out.println("StatusCode from remote http resource:"+arg0.getStatusCode());
    System.out.println("RawStatusCode from remote http resource:"+arg0.getRawStatusCode());
    System.out.println("StatusText from remote http resource:"+arg0.getStatusText());

    String body = new BufferedReader(new InputStreamReader(arg0.getBody()))
          .lines().collect(Collectors.joining("\n"));

    System.out.println("Error body from remote http resource:"+body);
    return false;
  }

  @Override
  public void handleError(ClientHttpResponse arg0) throws IOException {
    // do something
  }
});

Также вы можете вручную оценить тело или статус и вернуть true или false, чтобы пометить как ошибку или нет.

Ответ 3

Поймай RestClientResponseException вместо этого. Это более общий характер.

Из документов: общий базовый класс для исключений, которые содержат фактические данные ответа HTTP.