android - 在 retrofit2 界面中检索 SharedPreferences

标签 android sharedpreferences retrofit2 rx-java2

我正在尝试通过改造和 rxjava2 以编程方式向我的 api 调用添加授权 header ,因此我向其添加了一个 okhttp3 拦截器。这是我的完整代码:

public interface APIService {

    class ServiceInterceptor implements Interceptor{


        @NonNull
        @Override
        public okhttp3.Response intercept(@NonNull Chain chain) throws IOException {
            Request request = chain.request();
            if (request.header("No-Authentication") == null){
                SharedPreferences sharedPref = ???.getSharedPreferences(USER, Context.MODE_PRIVATE); <---
                request = request.newBuilder()
                        .addHeader("Authorization", "JWT " + sharedPref.getString("auth_token", null))
                        .build();
            }
            return chain.proceed(request);
        }
    }


    OkHttpClient apiClient = new OkHttpClient().newBuilder()
            .addInterceptor(new ServiceInterceptor())
            .build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://192.168.1.8:8000/api/v1/")
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .client(apiClient)
            .build();

    @GET("rest-auth/user/")
    Single<Response<User>> getUserDetails();

    @POST("rest-auth/login/")
    @Headers("No-Authorization: true")
    Single<Response<AuthUserResponse>> loginUser(@Body LoginRequest body);

    @POST("rest-auth/registration/")
    @Headers("No-Authorization: true")
    Single<Response<AuthUserResponse>> signupUser(@Body SignupRequest body);

}

问题是我无法从 sharedPreferences 检索 auth_token,因为我不知道如何将上下文传递给它。有什么建议么? 谢谢。

最佳答案

您需要为您的 ServiceInterceptor 类创建一个构造函数,将 auth_token 作为参数传递,类似于

 private String authToken;

 public ServiceInterceptor(String authToken) {
     this.authToken = authToken;
 }

这样你就可以在拦截器类之外处理上下文和 SharedPreferences,无论如何它都不应该知道 android 的东西。

然后在您的intercept 方法中您可以获得authToken。

关于android - 在 retrofit2 界面中检索 SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53504324/

相关文章:

java - 依次使用不同的请求正文发出多个 API 请求

android - 如何上传文件到谷歌驱动器。是否可以通过 Retrofit 2

android - Google maps API V2 安装到真机后黑屏

android - 在 Gridview 中选中一个复选框时,多个复选框被选中(取消)选中 - Android

android - 强制 HttpURLConnection 使用移动网络并回退到 WiFi

Java - Android PreferenceFragment 保存和加载首选项

flutter - 将条件 'Future<bool>'更改为静态类型 'bool'

安卓|使用改造 2 和本地 API 的基本身份验证

android - 如何在Android中做 'busy'动画?

android - 根据 SecondActivity 的变化更新 First Activity 中的 TextView