Flutter使用Dio携带正确Bearer Token请求仍返回Http 401错误
问题原因
- 最核心的错误是GET请求参数传值位置错误:Dio中
data字段是用来传递请求体的,仅POST/PUT等支持请求体的请求方法会携带该字段内容,GET请求默认不会携带请求体,你把phoneNo参数放到data中,后端无法获取到必要的校验参数,触发权限校验失败返回401。 - 额外的隐性问题:你给GET请求配置了
content-Type: application/json请求头,GET请求本身没有请求体,该配置属于无效配置,部分严格校验的后端服务会直接拒绝这类格式错误的请求。 - 其他可排查点:即使你确认token无误,也可能存在token拼接时多了空格/换行符、后端要求额外鉴权header(如设备标识、版本号)、token实际已过期的情况。
解决方案
1. 修复请求参数配置
将GET请求的参数从data字段迁移到queryParameters字段,同时移除GET请求下不必要的Content-Type配置,修改后的代码如下:
final dio = Dio(); try { await dio.request( 'https://api.example.com/api/v1/auth/validateMobile', // 把原来的data换成queryParameters queryParameters: {"phoneNo": "+91999999999"}, options: Options( method: 'GET', headers: { HttpHeaders.authorizationHeader: 'Bearer $token', }, ), ); } on DioError catch (e) { // 打印完整的响应信息,看后端返回的具体错误描述 print(e.response?.data); print(e); }
2. 排查鉴权信息有效性
添加Dio日志拦截器,打印实际发出的请求头和参数,确认Authorization是否正确携带、token是否和预期一致:
// 初始化dio时添加日志拦截器 final dio = Dio()..interceptors.add(LogInterceptor( requestHeader: true, requestBody: true, responseHeader: true, ));
3. 接口适配调整
如果后端明确要求该接口必须在请求体中传参,把请求方法从GET改为POST即可,保留原来的data字段配置即可。
内容的提问来源于stack exchange,提问作者Niteesh
相关产品推荐
相关产品推荐

