Как динамически добавлять заголовок авторизации в запрос на модернизацию с помощью annontation?

#android #kotlin #retrofit2

#Android #kotlin #retrofit2

Вопрос:

На самом деле я использую Retrofit 2 в своем приложении для Android (я использую Kotlin) и хочу выполнить post-запрос, как показано ниже :

 @Headers("Authorization: Bearer: $Constants.TOKEN")
@POST("/task")
fun createTask(object:Object)
  

Запрос отлично работает, когда дело доходит до того, что токен является константой, но я хочу, чтобы он был динамическим.

После долгих поисков я нашел решения, подобные приведенным ниже :

 @POST("/task")
fun createTask(@Header("Authorization: Bearer") authorization:String, object:Object)
  

или

 @POST("/task")
fun createTask(@HeaderMap header:Map<String, String>, object:Object)
  

Когда я попробовал это, я получил сообщение об ошибке типа :

 bad request : error at char 0x20 
  

Ответ №1:

Я также столкнулся с той же проблемой, но затем я попробовал что-то вроде:

 @POST("/task")
fun createTask(@Header("Authorization") authorization, object:Object)
  

И добавьте Bearer к вашему токену, который вы передаете, например

 createTask("Bearer ".plus(access_token))
  

Также кажется : , что добавляемое вами дополнительное двоеточие вызывает ошибку, удаление двоеточия также может сработать.

Комментарии:

1. Удаление «:» не сработало, но ваше первое решение является лучшим.. Действительно здорово!!

Ответ №2:

Чтобы сделать заголовок динамическим, я использую перехватчик заголовков при использовании модернизации,

 class HeaderInterceptor: Interceptor {

/**
 * Interceptor class for setting of the dynamic headers for every request
 */
override fun intercept(chain: Interceptor.Chain): Response {
    var request = chain.request()
    request = request?.newBuilder()
            // dynamic token you get should be use instead of #YOUR_DYNAMIC_TOKEN.
            ?.addHeader("Authorization: Bearer", #YOUR_DYNAMIC_TOKEN)  
            ?.build()
    return chain.proceed(request)
}
  

}

Теперь мы можем использовать его, как показано ниже

 @Provides
@Singleton
fun getOkHttpClient(): OkHttpClient {
     val interceptor = HttpLoggingInterceptor()
     interceptor.level = HttpLoggingInterceptor.Level.BODY
     val builder = OkHttpClient.Builder()
     builder.addInterceptor(interceptor)
            .connectTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .addInterceptor(HeaderInterceptor())                
     return builder.build()
  

}


или просто мы можем использовать его напрямую, как :

 @Provides
  @Singleton
  fun getOkHttpClient(): OkHttpClient {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val builder = OkHttpClient.Builder()
        builder.addInterceptor(interceptor)
                .connectTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .followRedirects(true)
                .followSslRedirects(true)
                .addInterceptor { chain ->
                    val newRequest = chain.request().newBuilder()
                            .addHeader("Authorization: Bearer", #YOUR_DYNAMIC_TOKEN)
                            .build()
                    chain.proceed(newRequest)
                }
  }