Mohamed Jihed Jaouadi
Mohamed Jihed Jaouadi

Reputation: 1517

How to add authorization header dynamically in a retrofit request using annontation?

Actually I'm using Retrofit 2 in my Android application (I'm using Kotlin) and I want to execute a post request like below :

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

The request work perfectly when it comes that the token is a constant, but I want it to be dynamic.

After many search I found the solutions like below :

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

OR

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

When I try it, I got error like :

bad request : error at char 0x20 

Upvotes: 1

Views: 8761

Answers (2)

Arjun Vyas
Arjun Vyas

Reputation: 419

To make header dynamic I use Header-interceptor while using Retrofit,

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)
}

}

Now we can use it like below

@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()

}


or Simply we can use it directly like :

@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)
                }
  }

Upvotes: 3

Kashish Sharma
Kashish Sharma

Reputation: 769

I was also facing the same problem, but then I tried something like:

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

And append Bearer to your token that you're passing, like

createTask("Bearer ".plus(access_token))

Also it seems like the extra colon : you're adding is causing the error, removing the colon might also work.

Upvotes: 8

Related Questions