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

Flutter使用dio包发起GET请求传JSON body返回rslt为空问题

问题现象

目标API接口在Postman中可正常调用,在Flutter应用中调用时返回如下结果,其中rslt字段为空数组,不符合预期:

{"success": true,
"rslt": []}

Postman正常调用效果参考:
Postman正常调用截图

现有实现代码
dynamic getData(dynamic token) {
dio.options.headers['Authorization'] = '$token';
return await dio.get<dynamic>('https://address',
    queryParameters: <String,dynamic>{'cn': 'iPhone_11', 'qt': '20', 'ct': 'Delhi'});
}
问题排查与修复

逐个核对以下高频踩坑点,就能定位问题:

  • 首先是基础语法错误:代码中使用了await关键字,但函数声明没有加async,也没有声明返回值类型是Future,这段代码本身无法正常编译运行,如果你本地运行的是补全了语法的版本,继续核对以下问题。
  • 最常见的根因是请求内容和Postman发出的请求不一致:
    1. 核对Authorization请求头格式:绝大多数接口的鉴权头要求携带前缀,比如标准格式是Bearer $token,你现在直接传入token值,服务端鉴权逻辑未通过但没有抛出错误,会直接返回空数据集。
    2. 核对是否遗漏必要请求头:Postman默认会自动携带Accept: application/json、User-Agent等请求头,部分接口会校验这些头字段,缺失时不会报错,只返回空结果。
  • 其次是参数格式问题:
    1. 你当前传入的qt参数是字符串类型'20',如果接口要求该字段为数值类型,直接传入数字20即可,不需要加引号。
    2. 核对Dio的参数转义逻辑,确认参数里的下划线、特殊字符没有被错误转义,最终拼接出的请求URL和Postman发出的完全一致。
  • 最后排查全局配置干扰:如果你给当前Dio实例配置过全局拦截器、默认参数、baseUrl,先检查拦截器逻辑是否擅自修改了你的请求头、请求参数,出现参数覆盖、多余参数注入的问题。

最快的定位方式:给Dio添加内置的LogInterceptor日志拦截器,打印实际发出的完整请求URL、请求头、请求参数,和Postman中查看的原始请求内容逐行对比,存在差异的地方就是问题根源。

参考修复代码:

Future<dynamic> getData(dynamic token) async {
  // 补全鉴权头前缀、必要通用请求头
  dio.options.headers['Authorization'] = 'Bearer $token';
  dio.options.headers['Accept'] = 'application/json';
  return await dio.get<dynamic>(
    'https://address',
    queryParameters: <String, dynamic>{
      'cn': 'iPhone_11',
      'qt': 20, // 按接口要求修正参数类型
      'ct': 'Delhi'
    },
  );
}

内容的提问来源于stack exchange,提问作者samsonmarandi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.21 16:16:02