Retrofit携带Bearer Token发起GET请求返回401未授权问题求助
问题原因与解决方案
1. 首要排查:Header参数传递格式错误
Retrofit的@Header("Authorization")注解会自动拼接请求头的键名,你传递的参数仅需要填写头的值,不需要包含Authorization: 前缀:
- 错误传值示例:
"Authorization: Bearer 你的API密钥"(会导致最终请求头重复键名,变为Authorization: Authorization: Bearer xxx,直接触发鉴权失败) - 正确传值示例:
"Bearer 你的API密钥"(注意Bearer首字母大写,后面跟1个半角空格再接密钥,不要有多余字符)
2. 更规范的全局鉴权配置(可选)
如果项目中多数接口都需要Bearer Token鉴权,推荐用OkHttp拦截器全局统一添加请求头,不用每个接口单独传Header参数,避免重复出错:
// 构建OkHttpClient时添加拦截器 val okHttpClient = OkHttpClient.Builder() .addInterceptor { chain -> val originalRequest = chain.request() // 排除不需要鉴权的/book类接口 if (!originalRequest.url.encodedPath.startsWith("/book")) { val requestWithAuth = originalRequest.newBuilder() .header("Authorization", "Bearer 你的API密钥") .build() return@addInterceptor chain.proceed(requestWithAuth) } chain.proceed(originalRequest) } .build() // 构建Retrofit实例时传入配置好的okHttpClient val retrofit = Retrofit.Builder() .baseUrl("https://the-one-api.dev/v2/") .client(okHttpClient) // 其他配置如JSON转换器等 .build()
配置完成后可以直接删除LotrApi中getMovieList方法的authHeader参数,调用接口时也不需要再单独传Header。
3. 兜底排查点
- 确认你的API密钥是激活有效的,没有拼写错误、首尾没有多余空格
- 确认Retrofit的baseUrl配置正确,末尾带
/,和接口路径拼接后没有多余斜杠或路径缺失 - 可接入OkHttp的LoggingInterceptor打印完整请求日志,直接核对请求头里的Authorization字段是否符合预期
内容的提问来源于stack exchange,提问作者Hasan Altay
相关产品推荐
相关产品推荐

