Android 访问令牌更新匕首和改装时更新请求标头
我想在网络请求中更新访问令牌。但是使用Dagger和改装有一些困难Android 访问令牌更新匕首和改装时更新请求标头,android,retrofit,dagger,okhttp3,Android,Retrofit,Dagger,Okhttp3,我想在网络请求中更新访问令牌。但是使用Dagger和改装有一些困难 嗯,我已经这么做过很多次了,从来没有注意到访问令牌刷新没有进入OkHttp链的任何问题。以下是我在应用程序中使用的典型设置: @Provides @Singleton SharedPreferences providePreferences(Context ctx) { return new SharedPreferences(ctx); } @Provides @Singleton HttpLoggingInterc
嗯,我已经这么做过很多次了,从来没有注意到访问令牌刷新没有进入OkHttp链的任何问题。以下是我在应用程序中使用的典型设置:
@Provides @Singleton
SharedPreferences providePreferences(Context ctx) {
return new SharedPreferences(ctx);
}
@Provides @Singleton
HttpLoggingInterceptor provideLoggingInterceptor(){
return new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY);
}
@Provides @Singleton
OkHttpClient provideClient(HttpLoggingInterceptor interceptor, SharedPreferences prefs){
return new OkHttpClient.Builder()
.addNetworkInterceptor(chain -> {
// Add Auth Header
String token = prefs.accessToken().get();
if(token == null) token = "";
Request request = chain.request().newBuilder().addHeader("Authorization", token).build();
return chain.proceed(request);
})
.addInterceptor(interceptor)
.build();
}
@Provides @Singleton
Retrofit provideRetrofit(@ApiUrl String url, OkHttpClient client){
return new Retrofit.Builder()
.baseUrl(url)
.client(client)
.addConverterFactory(LoganSquareConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
}
SharedPreferences
只是我将一些RxSharedPreferences
逻辑抽象到的一个类。也可以通过这种方式在应用程序中的任何需要的地方注入,这很好。下面是该课程的一个简单版本,只是为了好玩:
public class SharedPreferences {
// Constants and variables
private static final String PREFERENCE_FILENAME = BuildConfig.APPLICATION_ID + ".prefs";
private static final String PREF_ACCESS_TOKEN= "pref_access_token";
private RxSharedPreferences mRxSharedPrefs;
// Constructor
public SharedPreferences(Context context) {
mRxSharedPrefs = RxSharedPreferences.create(context.getSharedPreferences(PREFERENCE_FILENAME, Context.MODE_PRIVATE));
}
// Helper methods
public Preference<String> accessToken() { return mRxSharedPrefs.getString(PREF_ACCESS_TOKEN, ""); }
public void logout() { accessToken().delete(); }
}
公共类共享引用{
//常数和变量
私有静态最终字符串首选项\u FILENAME=BuildConfig.APPLICATION\u ID+“.prefs”;
私有静态最终字符串PREF\u ACCESS\u TOKEN=“PREF\u ACCESS\u TOKEN”;
专用RxSharedPreferences mRxSharedPrefs;
//建造师
公共共享引用(上下文){
mRxSharedPrefs=RxSharedPreferences.create(context.getSharedReferences(PREFERENCE_FILENAME,context.MODE_PRIVATE));
}
//辅助方法
公共首选项accessToken(){return mRxSharedPrefs.getString(PREF_ACCESS_TOKEN,“”;}
public void logout(){accessToken().delete();}
}
这真的有效吗?比如说,如果我在我的活动中注入改造,并发出一个请求,返回我存储到共享首选项中的authtoken。这是否意味着我将能够使用相同的改装实例发出经过身份验证的请求?我想不会。需要有一种方法来重新注入或更新改造。每次发出HTTP请求时读取首选项似乎不是最好的主意。