web-dev-qa-db-fra.com

Comment récupérer le code d'état HTTP et le corps de réponse lorsqu'une exception RestClientException est levée?

Les méthodes de RestTemplate telles que postForEntity() throw RestClientException. Je voudrais extraire le code d'état HTTP et le corps de réponse de cet objet d'exception dans le bloc catch. Comment puis je faire ça?

28
Vathanak

Au lieu d'attraper RestClientException, attrapez le spécial HttpClientErrorException.

Voici un exemple:

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 fournit getStatusCode et getResponseBodyAsByteArray pour obtenir le code d'état et le corps, respectivement .

40
Willie Wheeler

Dans certains cas, HttpClientErrorException n'est pas levé. Par exemple, la méthode suivante restTemplate.exchange :

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

Obtenez le corps http et marshall vers une entité. Si la ressource distante renvoie une erreur rare, le marshall interne ne fonctionne pas et juste une exception RestClientException est levée.

restTemplate.setErrorHandler

Dans ce cas ou si vous souhaitez gérer toute erreur dans les opérations restTemplate , vous pouvez utiliser setErrorHandler . Cette méthode reçoit un ResponseErrorHandler de base avec des méthodes utiles.

Cette méthode hasError m'a permis d'obtenir le texte du corps http distant et m'a aidé à détecter l'erreur de l'invocation ou dans la ressource distante http distante:

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
  }
});

Vous pouvez également évaluer manuellement le corps ou l'état et retourner vrai ou faux afin de signaler comme erreur ou non.

1
JRichardsz

Attrapez RestClientResponseException à la place. C'est plus générique.

À partir de docs : classe de base commune pour les exceptions qui contiennent des données de réponse HTTP réelles.

1
eosimosu