Okhttp 刷新过期令牌时向服务器发送多个请求
我有一个和三个Web服务调用是在同时加载时进行的。ViewPager
ViewPager
当第一个返回401时,被调用并且我刷新里面的令牌,但剩余的2个请求已经使用旧的刷新令牌发送到服务器,并且失败,498在Interceptor中捕获并且应用程序被注销。Authenticator
Authenticator
这不是我所期望的理想行为。我想将第 2 个和第 3 个请求保留在队列中,并在刷新令牌时重试排队的请求。
目前,我有一个变量来指示令牌刷新是否正在进行中,在这种情况下,我取消了用户中的所有后续请求,并且用户必须手动刷新页面,或者我可以注销用户并强制用户登录。Authenticator
Interceptor
对于使用 okhttp 3.x for Android 解决上述问题,什么是好的解决方案或架构?
编辑:我想解决的问题是一般的,我不想对我的电话进行排序。即,等待一个调用完成并刷新令牌,然后仅在活动和片段级别发送请求的其余部分。
已请求代码。这是以下各项的标准代码:Authenticator
public class CustomAuthenticator implements Authenticator {
@Inject AccountManager accountManager;
@Inject @AccountType String accountType;
@Inject @AuthTokenType String authTokenType;
@Inject
public ApiAuthenticator(@ForApplication Context context) {
}
@Override
public Request authenticate(Route route, Response response) throws IOException {
// Invaidate authToken
String accessToken = accountManager.peekAuthToken(account, authTokenType);
if (accessToken != null) {
accountManager.invalidateAuthToken(accountType, accessToken);
}
try {
// Get new refresh token. This invokes custom AccountAuthenticator which makes a call to get new refresh token.
accessToken = accountManager.blockingGetAuthToken(account, authTokenType, false);
if (accessToken != null) {
Request.Builder requestBuilder = response.request().newBuilder();
// Add headers with new refreshToken
return requestBuilder.build();
} catch (Throwable t) {
Timber.e(t, t.getLocalizedMessage());
}
}
return null;
}
}
与此类似的一些问题:OkHttp 和 Retrofit,使用并发请求刷新令牌