Правильный способ обработки ошибки 401, если контроллер использует шаблон rest для вызова стороннего API - PullRequest
0 голосов
/ 31 декабря 2018

В моем весеннем загрузочном приложении у меня активирован вызов контроллера, который требует другого API.Этот сторонний API использует маркер доступа OAuth для определения доступности их API.Теперь в коде моего контроллера я использую метод restTemplate.exchange().Если сторонний API возвращает ответ 401, метод exchange() выдает HttpClientException.На данный момент я просто хочу повторно вызвать ссылку OAuth и повторно вызвать реальный ресурс API, не повторяя код снова.Является ли следующий код хорошим способом справиться с этим?

Код, который у меня сейчас есть, будет

@PostMapping("/activate")
public ResponseEntity<?> activate(@RequestBody RequestWrapper wrapper)
    throws InterruptedException {

    // if the token is empty without calling any other service, call auth
    if (token == null) {
        token = auth(); // get the access token
    }
    // if the token getting error
    while (token == null) {
        Thread.sleep(20000);
        token = auth();
    }
    // Calling preauth first
    String url = baseEndpoint + "/activate";
    HttpHeaders requestHeaders = new HttpHeaders();
    requestHeaders.set("Accept-Language", "en");
    requestHeaders.setBearerAuth(token);
    // Content-Type:application/json;charset=UTF-8
    requestHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
    // Accept:application/json
    requestHeaders.set(HttpHeaders.ACCEPT, String.valueOf(MediaType.APPLICATION_JSON));
    LOGGER.info("Header information: {}", requestHeaders);

    HttpEntity<RequestWrapper> requestEntity = new HttpEntity<>(wrapper, requestHeaders);
    ResponseEntity<ResponseWrapper> response = null;
    try {
        response = restTemplate
            .exchange(url, HttpMethod.POST, requestEntity, ResponseWrapper.class);
        Response preAuthResponse = response.getBody().getResponse();
        // handle the response if restTemplate status is 200

    } catch (Exception e) {
        if (e.getMessage().contains(String.valueOf(HttpStatus.UNAUTHORIZED.value()))) {
            return activate(wrapper);
        }
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }
}
...