Android端带Token调用API返回401错误,iOS正常的问题排查与解决
可能的原因及对应修复方法
1. Token格式或读取异常
Android端从Redux store读取的cookie(即Token)可能包含多余空格、换行或特殊字符,服务器解析时判定无效,而iOS端的字符串处理逻辑自动忽略了这些问题。
修复:
- 使用Token前添加格式化处理,去除前后冗余字符:
const token = cookie?.trim(); Authorization: `Bearer ${token}` - 调用接口前打印Token值,对比iOS端输出,确认两者完全一致:
console.log('Android Token:', cookie);
2. Axios请求头平台差异
部分Android环境下,axios对请求头的处理存在隐性差异(如头字段大小写转换、编码问题),导致Authorization头未被正确传递。
修复:
- 改用axios实例化方式统一配置请求头,避免重复设置的潜在问题:
// 创建全局axios实例 const apiClient = axios.create({ baseURL: '你的API基础地址', headers: { 'Content-Type': 'application/json', Accept: 'application/json', }, withCredentials: false, }); // 登录成功后统一设置授权头 apiClient.defaults.headers.common['Authorization'] = `Bearer ${token.trim()}`; // 重构请求封装函数 export const poster = async ({url, method = 'POST', body}: PosterType) => { try { const response = await apiClient({url, method, data: body}); const data = response.data; if (response.status >= 400) { throw new Error(data.message ?? data?.error?.message ?? '请求失败'); } return data; } catch (error) { console.error('请求错误详情:', error); throw error; } };
3. 网络层拦截或请求篡改
Android端的网络请求可能被系统安全策略、第三方库(如React Native网络模块)或代理工具修改,导致Authorization头丢失或Token被篡改。
修复:
- 用Charles/Fiddler抓包查看Android端实际请求,确认Authorization头是否存在且Token正确。
- 检查AndroidManifest.xml的网络权限配置,确保无请求头限制:
<uses-permission android:name="android.permission.INTERNET" /> - 排查项目中自定义的网络拦截器(如
axios.interceptors),确认其未修改Authorization头。
4. 时间同步或服务器解析差异
Android设备系统时间与服务器时间偏差过大,导致Token过期校验失败;或服务器因Android端请求的User-Agent差异,存在特殊解析逻辑导致Token验证不通过。
修复:
- 将Android设备系统时间同步到网络时间,确保与服务器时区一致。
- 统一请求头中的User-Agent,消除平台差异:
headers: { // ...其他请求头 'User-Agent': 'YourAppName/1.0.0' }
关键排查步骤
- 抓包对比Android和iOS端的请求头,确认Authorization字段的一致性。
- 打印并对比两端的Token值,排除格式差异。
- 检查设备时间与服务器时间的同步性。
- 排查项目中的网络拦截器或第三方库对请求的影响。
内容的提问来源于stack exchange,提问作者Ritik Chhipa
相关产品推荐
相关产品推荐

