如果 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));
我在下方 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));