我想在Retrofit2中使用授权。我选择了拦截器方式,因为几乎所有方法都需要授权,除了我正在设置令牌以便与其他方法一起使用。
我……
你可以通过以下方式做到:
首先使用单例实例创建一个首选项类
喜好
public class Preferences { public static Preferences INSTANCE; private final String PREFERENCE_FILE = "my_preferences"; public final String PREF_TOKEN = "pref_user_token"; private SharedPreferences mPrefs; private SharedPreferences.Editor mEdit; private Preferences() { Application app = MyApplicationClass.getInstance(); mPrefs = app.getSharedPreferences(PREFERENCE_FILE, Context.MODE_PRIVATE); mEdit = mPrefs.edit(); } // Returns singleton instance public static Preferences getInstance() { if (INSTANCE == null) INSTANCE = new Preferences(); return INSTANCE; } public String getToken() { return Preferences.getInstance().mPrefs.getString(PREF_TOKEN, ""); } public void saveToken(String value) { mEdit.putString(PREF_TOKEN, value); mEdit.apply(); } }
然后在你的RetrofitClient类中更改如下:
RetrofitClient
public class RetrofitClient { public static final String BASE_URL = "http://localhost"; public static Retrofit retrofit = null; private RetrofitClient() { retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .client(mClient) .build(); } OkHttpClient mClient = new OkHttpClient.Builder().addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request newRequest = chain.request().newBuilder() .addHeader("Authorization", "Bearer" + Preferences.getInstance().getToken()) } }) public static synchronized Retrofit getInstance() { if (retrofit == null) { retrofit = new Retrofit.Builder().baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()).build(); } return retrofit; } public Api getApi() { return retrofit.create(Api.class); } }
您可以使用应用程序上线时可用的应用程序上下文。从您的app类获取它:
public class MyApp extends Application { private static MyApp instance; @Override public void onCreate() { super.onCreate(); instance = this; //other code } public static MyApp getInstance() { return instance; }
然后简单地使用 MyApp.getInstance() 获取您需要的背景信息。使用这种方法,您可以实现您之前的想法并获得SharedPreferences RetrofitClient 类。
MyApp.getInstance()
不要忘记将您的应用类添加到清单。
更新: 您只需创建一次改装实例,因此如果您在拥有令牌时创建它 - 您将始终使用它,同时应用程序处于活动状态。 我认为,良好的做法是检查拦截器中的令牌。像这样的东西:
new Interceptor() { @Override public Response intercept(@NonNull Chain chain) throws IOException { Request request = chain.request(); if (tokenService.token == null) { return chain.proceed(request); } else { return chain.proceed(request.newBuilder().addHeader("Authorization", "Bearer" + tokenService.token).build()); } } }
另外,我不知道你的tokenService是如何工作的。但请记住,最好是始终检查令牌的共享首选项,如果您在注销时清除它。因为您的tokenService可能会保留令牌字符串,即使它已在共享首选项中清除。
只需在RetrofitClient或其他情况下将SharedPreferences添加为构造函数参数即可