问题陈述:
我在我的应用程序中使用Retrofit进行API调用。目前,我有20多个改造接口,具有不同的Callbacks
。目前,当应用在其中任何一个接口(例如INVALID_SESSION_ID
)中收到UpdateUserAPI
时,我通过调用ACCESS_TOKEN
来获取新的AccessTokenAPI
。
接近建议:
当应用在INVALID_SESSION_ID
的{{1}}中收到Callback
时,请调用UpdateUserAPI
以获取新的AccessTokenAPI
。收到新的ACCESS_TOKEN
后,请使用新ACCESS_TOKEN
发布实际通话(包含UpdateUserAPI
中的初始参数)。但这需要在实现ACCESS_TOKEN
的类中保存参数。此外,我只需要重试UpdateUserAPI
一次,这应该处理。
实施上述要求的最佳方法是什么?
答案 0 :(得分:3)
创建您自己的TokenInterceptor
public class TokenInterceptor implements Interceptor
然后将其设置为okktpclient
Interceptor tokenInterceptor = new TokenInterceptor(provideUserLoginDao(appDatabase));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(tokenInterceptor)
.writeTimeout(50, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build();
此帖中的有用信息还包括:Refreshing OAuth token using Retrofit without modifying all calls
答案 1 :(得分:0)
创建您自己的自定义拦截器,并检查您的令牌/ session_id是否有效。如果您的session_id已过期,然后点击您的updateUserAPI以获取新的ID,并在标题或所需位置设置此ID。这是一些代码示例。
RefreshTokenInterceptor
public static class RInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
try {
if (response.code() == 410) {
Response r = null;
try {
r = makeTokenRefreshCall(request, chain);
} catch (JSONException e) {
e.printStackTrace();
}
return r;
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
}
private static Response makeTokenRefreshCall(Request req, Interceptor.Chain chain) throws JSONException, IOException {
/* fetch refreshed token, some synchronous API call, whatever Because we are responsible to return new response */
refreshTokenSync();
Request newRequest;
newRequest = req.newBuilder().header("authorization", NEW_TOKEN)/*.post(req.body())*/.build();
return chain.proceed(newRequest);
}
RESTClient
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(50, TimeUnit.SECONDS)
.writeTimeout(55, TimeUnit.SECONDS)
.connectTimeout(50, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.addInterceptor(new NetworkInterceptor())
.build();