英文:
OkHttpClient doesn't add headers to requests
问题
我正在创建一个Android应用程序,使用Retrofit来消费API Web服务。我的问题是,当我使用注解添加标头时,它能正常工作。
@Headers("Authorization: jwt-token")
@POST("appusers-service/signin/identification")
suspend fun authentication(@Body body: LoginIdentificationDto.Params): NetworkResponse<LoginIdentificationDto.Result, LoginIdentificationDto.Errors>
但是,当我使用拦截器动态添加标头时,它不起作用。
@Provides
@Singleton
fun provideHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.callTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.addNetworkInterceptor {
val builder: Request.Builder = it.request().newBuilder()
builder.addHeader(AUTHORIZATION_HEADER, "jwt-token")
return@addNetworkInterceptor it.proceed(builder.build())
}
.build()
}
@Provides
@Singleton
fun provideRetrofit(httpClient: OkHttpClient, mapper: ObjectMapper): Retrofit {
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(httpClient)
.addCallAdapterFactory(NetworkResponseAdapterFactory())
.addConverterFactory(JacksonConverterFactory.create(mapper))
.build()
}
请问我如何解决这个问题呢?
英文:
I m creating an android app and i m using retrofit to consume api webservices. my problem is when i add a header using annotation, it works.
@Headers("Authorization: jwt-token")
@POST("appusers-service/signin/identification")
suspend fun authentication(@Body body : LoginIdentificationDto.Params) : NetworkResponse<LoginIdentificationDto.Result, LoginIdentificationDto.Errors>
but when I use intercepters to add the header dynamically, it doesn't work
@Provides
@Singleton
fun provideHttpClient() : OkHttpClient
{
return OkHttpClient.Builder()
.callTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.addNetworkInterceptor {
val builder : Request.Builder = it.request().newBuilder()
builder.addHeader(AUTHORIZATION_HEADER, "jwt-token")
return@addNetworkInterceptor it.proceed(builder.build())
}
.build()
}
@Provides
@Singleton
fun provideRetrofit(httpClient : OkHttpClient, mapper : ObjectMapper) : Retrofit
{
return Retrofit.Builder()
.baseUrl(BASE_URL)
.client(httpClient)
.addCallAdapterFactory(NetworkResponseAdapterFactory())
.addConverterFactory(JacksonConverterFactory.create(mapper))
.build()
}
how can i solve this problem please?
答案1
得分: 0
尝试这个代码:
return OkHttpClient.Builder()
.callTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.addInterceptor {
val builder: Request.Builder = it.request().newBuilder()
builder.addHeader(AUTHORIZATION_HEADER, "jwt-token")
return@addInterceptor it.proceed(builder.build())
}
.build()
注意我已将 addNetworkInterceptor 更改为 addInterceptor。
要获取更多信息,您可以参考这个答案:
https://stackoverflow.com/a/37120830/9394700
英文:
Try this one
return OkHttpClient.Builder()
.callTimeout(60, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.addInterceptor {
val builder : Request.Builder = it.request().newBuilder()
builder.addHeader(AUTHORIZATION_HEADER, "jwt-token")
return@addNetworkInterceptor it.proceed(builder.build())
}
.build()
Note that I have changed addNetworkInterceptor into addInterceptor.
For more information you can refer to this answer
https://stackoverflow.com/a/37120830/9394700
答案2
得分: 0
我所做的方式是创建一个名为 AuthInterceptor
的类
class AuthInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val authenticatedRequest = request.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", UserData.getAuthToken())
.build()
return chain.proceed(authenticatedRequest)
}
}
并且在你的 OkHttpClient
中使用它,就像这样。
val ohHttpClient = OkHttpClient.Builder()
ohHttpClient.addInterceptor(AuthInterceptor())
英文:
The way I'm doing is to have a class AuthInterceptor
class AuthInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
val authenticatedRequest = request.newBuilder()
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", UserData.getAuthToken())
.build()
return chain.proceed(authenticatedRequest)
}
}
And on your OkHtttpClient
use like this.
val ohHttpClient = OkHttpClient.Builder()
ohHttpClient.addInterceptor(AuthInterceptor())
专注分享java语言的经验与见解,让所有开发者获益!
评论