Повторный вызов API, если он возвращает Http 401 - PullRequest
0 голосов
/ 01 августа 2020

Я вызываю ниже API, используя jersey

JsonObject response = ConnectionUtil.getwebTarget()
                                        .request().
                 header("Authorization", "Bearer "+ access_token)
                                        .get(JsonObject.class);

Здесь accessToken - это переменная, которая получила значение путем вызова другого API. Теперь, если response.getStatus () возвращает 401, я хочу вызвать API, чтобы получить токен, и снова вызову указанную выше команду. как я могу уберечь себя от дублирования? На данный момент я пишу код ниже.

JsonObject response = ConnectionUtil.getwebTarget()
                                            .request().
                     header("Authorization", "Bearer "+ access_token)
                                            .get(JsonObject.class);
  if(response.getStatus()==401)
  {
    accessToken= new AccessToken().getAccessToken();
    JsonObject response = ConnectionUtil.getwebTarget()
                                            .request()
                                            .header("Authorization", "Bearer "+ access_token)
                                            .get(JsonObject.class);
}

как я могу сократить написание кода строки JsonObject response в два раза. Я, по крайней мере, хочу дважды проверить код 401, прежде чем выбросить индивидуальное исключение

Я новичок в java programming. может кто подскажет лог c. его базовая c кодировка, но я все еще борюсь.

Ответы [ 3 ]

1 голос
/ 01 августа 2020

это хороший кандидат на do...while l oop. Циклы do...while гарантируют выполнение хотя бы один раз и являются отличным нативным java инструментом для реализации этого типа повторных попыток c.

AccessToken accessToken;
JsonObject response;
int retryCount = 0;
final int MAX_RETRIES = 2;

do {
    accessToken= new AccessToken().getAccessToken();
    response = ConnectionUtil.getwebTarget().request().header("Authorization", "Bearer "+ access_token).get(JsonObject.class);
} while (response.getStatus()==401 && retryCount++ < MAX_RETRIES);

if (response.getStatus() == 401) {
    throw new CustomException("");
}

Стоит проверить эту ссылку а также, если вы хотите узнать больше

1 голос
/ 01 августа 2020

Напишите подпрограмму.

private JsonObject doRequest(AccessToken access_token) {
    return ConnectionUtil.getwebTarget()
             .request()
             .header("Authorization", "Bearer "+ access_token)
             .get(JsonObject.class);
}

, а затем используйте ее дважды

JsonObject response = doRequest(access_token);
if (response.getStatus() == 401) {
    access_token = new AccessToken().getAccessToken();
    response = doRequest(access_token);
}

'doRequest' может быть не лучшим именем, но я не знаю, что общая картина - то есть, что она на самом деле делает?

0 голосов
/ 01 августа 2020

Если вы ищете повторную попытку на основе политики, вы можете сделать что-то вроде this .

RetryPolicy retryPolicy = new RetryPolicy()
  .retryIf((ClientResponse response) -> response.getStatus() == 401)
  .withDelay(1, TimeUnit.SECONDS)
  .withMaxRetries(3);

Failsafe.with(retryPolicy).get(() -> webResource.post(ClientResponse.class, input));
...