【发布时间】:2016-08-25 03:07:13
【问题描述】:
我想在网络请求中更新访问令牌。但是使用 Dagger 和 Retrofit 有一些困难。
????对不起,我的英文不好,所以给你一个例子可能会很清楚。从头开始,我的想法是这样的:
提供保存在共享首选项中的访问令牌
@Provides
@ForOauth
Preference<String> provideAccessToken(RxSharedPreferences prefs) {
return prefs.getString(PrefsUtils.KEY_ACCESS_TOKEN);
}
使用访问令牌创建拦截器并添加到okhttp客户端
@Provides
@Singleton
@Named("Cached")
public OkHttpClient provideOkHttpClientWithCache(Application application, @ForOauth OauthInterceptor oauthInterceptor) {
...
builder.addInterceptor(oauthInterceptor);
...
}
我通过其构造函数提供
OauthInterceptor实例
@Inject
public OauthInterceptor(@ForOauth Preference<String> accessToken) {
this.accessToken = accessToken;
Timber.tag("OauthInterceptor");
}
但是由于 okhttp 客户端是单例的,当 prefs 中的访问令牌更新时它不会改变。我认为可能可行的另一种方法是使用自定义范围,如 @ForOauth 或其他东西,但这只是一个粗略的草图...
顺便说一句,我还有一个这样的想法:
在
intercept()方法中从首选项获取访问令牌,因此每次我都可以获得一个包含最新访问令牌的请求标头。
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
if (accessToken.isSet()) {
// Preference<String> accessToken
builder.header("Authorization", ACCESS_TYPE + accessToken.get());
} else {
builder.header("Authorization", "Bearer xxxxxx");
}
return chain.proceed(builder.build());
}
但是我还没有真正尝试过这个想法,而且我认为它不对????
我想知道我是否必须每次都创建一个新的 okhttp 客户端实例,或者我可以只更新访问令牌然后 okhttp 客户端单例可以刷新它的拦截器...
所以你能给我一些建议,或者一个简单的工作示例。
提前谢谢????
【问题讨论】:
标签: android retrofit dagger okhttp3