【问题标题】:OkHttpClient doesn't add headers to requestsOkHttpClient 不向请求添加标头
【发布时间】:2020-08-15 02:34:03
【问题描述】:

我正在创建一个 android 应用程序,并且我正在使用改造来使用 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()
}

请问我该如何解决这个问题?

【问题讨论】:

    标签: java android kotlin retrofit retrofit2


    【解决方案1】:

    试试这个

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

    请注意,我已将 addNetworkInterceptor 更改为 addInterceptor。 有关更多信息,您可以参考此答案 https://stackoverflow.com/a/37120830/9394700

    【讨论】:

      【解决方案2】:

      我正在做的就是上课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)
          }
      }
      

      在你的OkHtttpClient 上使用这样的方式。

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

      【讨论】:

      • 我认为我的解决方案和你的解决方案没有区别。它也不起作用:/
      • @Ghaylen 你试过用addInterceptor代替addNetworkInterceptor吗?
      猜你喜欢
      • 1970-01-01
      • 2015-03-22
      • 2019-07-16
      • 2012-01-30
      • 2016-04-10
      • 1970-01-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多