OkHttpClient不会将标头添加到请求中。

huangapple 未分类评论76阅读模式
英文:

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(&quot;Authorization: jwt-token&quot;)
@POST(&quot;appusers-service/signin/identification&quot;)
suspend fun authentication(@Body body : LoginIdentificationDto.Params) : NetworkResponse&lt;LoginIdentificationDto.Result, LoginIdentificationDto.Errors&gt;

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, &quot;jwt-token&quot;)
			
			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, &quot;jwt-token&quot;)
            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(&quot;Content-Type&quot;, &quot;application/json&quot;)
            .addHeader(&quot;Authorization&quot;, UserData.getAuthToken())
            .build()
        return chain.proceed(authenticatedRequest)
    }
}

And on your OkHtttpClient use like this.

val ohHttpClient = OkHttpClient.Builder()
ohHttpClient.addInterceptor(AuthInterceptor())

huangapple
  • 本文由 发表于 2020年8月15日 02:03:23
  • 转载请务必保留本文链接:https://java.coder-hub.com/63417910.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定