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