请求GitHub API时遭遇401错误,如何解决该问题?
解决调用用户信息接口返回401未授权的问题
以下是针对你遇到的401错误的排查和解决步骤:
1. 检查Authorization请求头格式(最常见原因)
绝大多数API要求Authorization头的格式为 Bearer <你的access token>,你的代码中直接传递了原始token,缺少Bearer 前缀。
修改方法:
在调用getUserData时,给token添加前缀:
override fun callGetUserData(token: String) { Log.e("MainPresenter", "1") if (view.isNetworkAvailable()) { Log.e("MainPresenter", "2") view.showLoading() // 添加Bearer前缀 val authToken = "Bearer $token" disposable = repository .getUserData(authToken) .applyIoScheduler() .subscribe { response -> Log.e("MainPresenter", "3") Log.e("MainPresenter", "${response.code()}") view.hideLoading() when (response.code()) { in 200..202 -> response.body()?.let { itBody -> Log.e("LoginPresenter", "itBody : $itBody") view.loadGetUserData(itBody) } // 新增401日志,方便调试 401 -> Log.e("MainPresenter", "Token无效或格式错误") } } } }
同时建议将Api Service中的请求头字段改为首字母大写(HTTP头不区分大小写,但部分服务可能严格校验):
@Headers("Accept: application/json") @GET("user") fun getUserData( @Header("Authorization") token: String ): Single<Response<UserResponse>>
2. 验证token本身的有效性
- 用JWT离线解析工具查看token的
exp字段,确认token是否已过期。 - 检查获取token的流程:是否请求了正确的权限范围(scope)、是否误用了
refresh token(refresh token仅用于刷新access token,无法直接调用业务接口)。 - 用Postman模拟请求:将获取到的token加上
Bearer前缀调用/user接口,如果Postman也返回401,说明token本身无效,需要重新检查token获取逻辑。
3. 排查token传递过程中的问题
在调用getUserData前打印完整的Authorization头内容,确认token没有被截断或篡改:
Log.e("MainPresenter", "传递的Authorization头: $authToken")
4. 确认API环境一致性
检查获取token的接口和调用用户信息的接口是否使用相同的环境(测试/生产),跨环境的token通常无法通用。
内容的提问来源于stack exchange,提问作者Rey
相关产品推荐
相关产品推荐

