Android / Kotlin: доступ к разделяемым ссылкам внутри Retrofit Interceptor - PullRequest
1 голос
/ 19 сентября 2019

Вот Retrofit Interceptor, используемый для автоматической инъекции токена внутри запросов.Я пытаюсь получить этот токен из sharedPreferences, но getSharedPreferences там недоступен.

Как я могу получить свой токен из общих преференций внутри этого перехватчика?

import android.preference.PreferenceManager
import okhttp3.Interceptor
import okhttp3.Response

class ServiceInterceptor: Interceptor {

    var token : String = "";

    override fun intercept(chain: Interceptor.Chain): Response {
        var request = chain.request()

        if(request.header("No-Authentication") == null){

            if (request.url.toString().contains("/user/signin") === false) {
                // Add Authorization header only if it's not the user signin request.

                // Get token from shared preferences
                val sharedPreference = PreferenceManager.getSharedPreferences()
                token = sharedPreference.getString("token")

                if (!token.isNullOrEmpty()) {
                    val finalToken = "Bearer " + token
                    request = request.newBuilder()
                        .addHeader("Authorization", finalToken)
                        .build()
                }

            }

        }

        return chain.proceed(request)
    }

}

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Как прокомментировал coroutineDispatcher, вы должны передать общие предпочтения в конструктор перехватчика и сохранить ссылку на них.

Попробуйте это:

class ServiceInterceptor(private val prefs: SharedPreferences): Interceptor {

    val token: String get() = prefs.getString("token")

    override fun intercept(chain: Interceptor.Chain): Response {
        var request = chain.request()

        if(request.header("No-Authentication") == null){

            if (request.url.toString().contains("/user/signin") === false) {
                // Add Authorization header only if it's not the user signin request.
                request = token
                    .takeUnless { it.isNullOrEmpty }
                    ?.let {
                        request.newBuilder()
                            .addHeader("Authorization", "Bearer $it")
                            .build()
                    }
                    ?: request
            }
        }
        return chain.proceed(request)
    }

}

Перехватчик теперь получает ссылкук общим настройкам, чтобы зависимость была инвертирована, и это может позволить легко тестировать, помечая переданные SharedPreferences.

И это может быть реализовано следующим образом:

ServiceInterceptor(PreferenceManager.getSharedPreferences())
0 голосов
/ 19 сентября 2019

попробуйте это

val token = PreferenceManager.getSharedPreferences (). GetToken ("", "")

builder.addInterceptor { chain ->
            val original = chain.request()
            val requestBuilder = original.newBuilder()
                .addHeader("Authorization", "Bearer $token")
            val request = requestBuilder.build()
            chain.proceed(request)
        }
        return builder.build()
0 голосов
/ 19 сентября 2019

Вы можете создать singleton class для SharedPreference, а затем получить к нему доступ из любого class.

Пример

class SessionManager private constructor(context:Context) {
  private val prefs:SharedPreferences
  private val editor:SharedPreferences.Editor
  var token:String
  get() {
    return prefs.getString("token", "")
  }
  set(token) {
    editor.putString("token", token)
    editor.apply()
  }
  init{
    prefs = context.getSharedPreferences("Your_Preference_name", Context.MODE_PRIVATE)
    editor = prefs.edit()
  }
  companion object {
    private val jInstance:SessionManager
    @Synchronized fun getInstance(context:Context):SessionManager {
      if (jInstance != null)
      {
        return jInstance
      }
      else
      {
        jInstance = SessionManager(context)
        return jInstance
      }
    }
  }
}

Теперь вам нужно передать context в constructor из ServiceInterceptor, и вы можете получить доступ к SharedPreference, как показано ниже.

val token = SessionManager.getInstance(context).token;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...