问题陈述:
在我的API调用应用程序中,我使用Retrofit。目前我有20+重装接口,与不同的Callbacks。目前,当应用程序在这些接口(如UpdateUserAPI)中接收到UpdateUserAPI时,我必须通过调用AccessTokenAPI来获得新的ACCESS_TOKEN。
建议的方法:
当应用程序在INVALID_SESSION_ID中接收到Callback in UpdateUserAPI时,调用AccessTokenAPI获得新的ACCESS_TOKEN。在接收到新的ACCESS_TOKEN后,使用新的ACCESS_TOKEN发布实际调用(带有UpdateUserAPI中的初始参数)。但是这需要在实现UpdateUserAPI的类中保存参数。另外,我需要重新尝试只获得一次ACCESS_TOKEN,这应该被处理。
实现上述需求的最佳方法是什么?
发布于 2018-04-03 10:55:11
创建自己的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
发布于 2018-10-30 12:17:23
创建您自己的自定义拦截器,并检查令牌/会话_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();https://stackoverflow.com/questions/49627726
复制相似问题