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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:24:02