Flutter使用dio包发起GET请求传JSON body返回rslt为空问题
问题现象
目标API接口在Postman中可正常调用,在Flutter应用中调用时返回如下结果,其中rslt字段为空数组,不符合预期:
{"success": true, "rslt": []}
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发出的请求不一致:
- 核对
Authorization请求头格式:绝大多数接口的鉴权头要求携带前缀,比如标准格式是Bearer $token,你现在直接传入token值,服务端鉴权逻辑未通过但没有抛出错误,会直接返回空数据集。 - 核对是否遗漏必要请求头:Postman默认会自动携带
Accept: application/json、User-Agent等请求头,部分接口会校验这些头字段,缺失时不会报错,只返回空结果。
- 核对
- 其次是参数格式问题:
- 你当前传入的
qt参数是字符串类型'20',如果接口要求该字段为数值类型,直接传入数字20即可,不需要加引号。 - 核对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
相关产品推荐
相关产品推荐

