Методы RestTemplate
, такие как postForEntity()
throw RestClientException
. Я хотел бы извлечь код состояния HTTP и тело ответа из этого объекта исключения в блоке catch. Как я могу это сделать?
Как получить код состояния HTTP и тело ответа при вызове RestClientException?
Ответ 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.