You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在API Client中添加Bearer Token的技术求助

问题:API请求中Bearer Token未成功添加

尝试在API请求的Header中加入Bearer Token,但Token并未出现在实际请求里,相关代码及请求截图如下:

原代码

object APIClient {

    val client: ApiInterface
        get() {
            val httpLoggingInterceptor =
                HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)


            val okHttpClient = OkHttpClient.Builder()
                .addInterceptor { chain -
                    val request = chain.request().newBuilder()
                        .addHeader("Authorization", "Bearer ${getString(TOKEN, "")}")
                        .build()
                    chain.proceed(request)
                }
                .addInterceptor(httpLoggingInterceptor)
                .build()

            val retrofit: Retrofit = retrofit2.Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build()
            return retrofit.create(ApiInterface::class.java)
        }
}

请求截图

请求响应截图


问题排查与修复

1. 修复拦截器语法错误

代码中拦截器的lambda表达式存在语法错误:chain - 需改为 chain ->。这个错误会导致拦截器逻辑无法正常编译执行,自然不会添加Authorization Header。

2. 确保Token获取逻辑有效

getString(TOKEN, "") 需要确认是从正确的存储实例(比如SharedPreferences)中获取,且TOKEN对应的键存在有效的Token值。如果返回空字符串,会生成无效的Bearer Header,等同于未添加。

修复后的完整代码

object APIClient {
    // 根据实际场景实现Token获取逻辑,示例为Android SharedPreferences
    private fun getValidToken(): String {
        // 替换为你的SharedPreferences实例获取代码
        val sharedPref = /* Context.getSharedPreferences("your_pref_name", Context.MODE_PRIVATE) */
        return sharedPref.getString(TOKEN, "") ?: ""
    }

    val client: ApiInterface
        get() {
            val httpLoggingInterceptor =
                HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)

            val okHttpClient = OkHttpClient.Builder()
                .addInterceptor { chain -> // 修复lambda语法
                    val token = getValidToken()
                    val requestBuilder = chain.request().newBuilder()
                    // 仅当Token非空时添加Header
                    if (token.isNotEmpty()) {
                        requestBuilder.addHeader("Authorization", "Bearer $token")
                    }
                    chain.proceed(requestBuilder.build())
                }
                .addInterceptor(httpLoggingInterceptor)
                .build()

            val retrofit = Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(okHttpClient)
                .build()
            return retrofit.create(ApiInterface::class.java)
        }
}

额外检查点

  • 打印getValidToken()的返回值,确认Token确实存在且不为空。
  • 确认拦截器执行顺序:当前先添加Header拦截器、再添加Logging拦截器,日志会正确输出带Header的请求。
  • 检查是否有其他拦截器修改或覆盖了Authorization Header。

内容的提问来源于stack exchange,提问作者Techno World

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:48:31