如果 returns Http 401 再次调用 API

Calling API again if it returns Http 401

我在下方 API 使用球衣

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 的新手。有人能告诉我逻辑吗?它的基本编码,但我仍在苦苦挣扎。

写一个子程序。

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' 可能不是最好的选择名称,但我不知道大局是什么 - 即它实际上在做什么?

这是 do...while 循环的一个很好的候选者。 do...while 循环保证至少执行一次,并且是一个很好的原生 java 工具来实现这种类型的重试语义。

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

如果您想了解更多信息,也值得一试 this reference

如果您正在寻找基于策略的重试,您可以执行类似 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));