Получить SharedPreferences в интерфейсе retrofit2 - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь программно добавить заголовок авторизации в мои вызовы API с помощью retrofit и rxjava2, поэтому я добавил к нему перехватчик 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);

}

Проблема в том, что я не могу получить auth_token из sharedPreferences, потому что я не знаю, как передать ему контекст.Какие-либо предложения?Спасибо.

1 Ответ

0 голосов
/ 27 ноября 2018

Вам нужно создать конструктор для вашего ServiceInterceptor класса, передавая auth_token в качестве параметра, что-то вроде

 private String authToken;

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

Таким образом, вы обрабатываете контекст и SharedPreferences вне вашего класса-перехватчика, этоВ любом случае, вы не должны знать об андроиде.

Тогда по вашему intercept методу вы можете получить authToken.

...