Добавить токен в заголовок при отправке запроса на API
Есть API, который возвращает токен в ответ на отправку логина и пароля. Чтобы получить ответ от удалённого ресурса, для этого нужно отправить токен в "Authorization". Использую архитектуру MVVM совместно с koin и retrofit. Сам токен сохраняю в базу данных, однако, когда вытягиваю его в Interceptor, то токен является null, в инспекторе БД токен не null.
// AuthInterceptor.kt
class AuthInterceptor(var settings: Settings?) : Interceptor {
private lateinit var token: String
private lateinit var request: Request
override fun intercept(chain: Interceptor.Chain): Response {
val authHeader = chain.request().header("Authorization")
token = settings?.value ?: ""
if (::token.isInitialized) {
request = if (authHeader.isNullOrEmpty() && !token.isNullOrEmpty()) {
chain.request().newBuilder()
.addHeader("Authorization", "Bearer $token")
.build()
} else {
chain.request()
}
}
return chain.proceed(request)
}
}
//NetworkModule.kt
fun provideRetrofit(
gson: Gson,
client: OkHttpClient,
settingsDao: SettingsDao
): Retrofit {
val logging = if (BuildConfig.DEBUG) {
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
} else {
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC)
}
var result:Settings? = null
runBlocking {
launch {
result = settingsDao.getSettingsByName("auth_token")
}
}
return Retrofit.Builder()
.baseUrl(BuildConfig.SERVER_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.client(
client.newBuilder()
.addInterceptor(logging)
.addInterceptor(AuthInterceptor(result))
.build()
)
.build()
}
single {
provideRetrofit(
get(),
get(),
get()
)
}
Важна любая информация по этому вопросу. Хотел по этому вопросу сделать, но не догадался как реализовать ответ ответ. Не понял как вызвать в репозитории конкретную реализацию. И непонятно, получу я актуальную информацию или же предыдущее значение вызова.
factory { get<Retrofit>(named("r1")).create(Services::class.java) }
factory { get<Retrofit>(named("r2")).create(Services::class.java) }
single<Retrofit>(named("r1")) {
Retrofit.Builder()
.baseUrl(BuildConfig.SERVER_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(GsonConverterFactory.create(get()))
.client(get())
.build()
}
single<Retrofit>(named("r2")) {
provideRetrofit(
get(),
get(),
get()
)
}