Reputation: 1517
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
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
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