В моем весеннем загрузочном приложении у меня активирован вызов контроллера, который требует другого 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);
}
}