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

Flutter从本地NodeJS服务获取JSON数据时解析报错如何解决?

问题原因
  • 参数校验不匹配:你代码中请求传的password参数为adminADMIN,与接口存储的正确密码adminAdmin大小写不一致,后端大概率校验账号密码失败后,未按规范返回错误状态码,仍然返回200但响应体为空,导致JSON解析时检测到内容为空抛出异常。
  • 访问地址错误:如果你是在模拟器/真机上运行项目,请求地址中的localhost指向的是运行设备本身而非你部署接口的电脑,实际没有请求到目标接口,拿到的是空响应。
  • 跨域拦截:如果运行的是Flutter Web项目,后端未配置CORS跨域规则时,浏览器会拦截响应内容,你能看到状态码为200,但Flutter实际拿到的响应体为空。
  • 后端响应不规范:后端接口未正确设置响应的Content-Type,或者业务逻辑异常时返回了非JSON格式的空内容/半结构化内容。
解决步骤
  1. 先新增日志打印确认核心问题,在判断statusCode之后先打印响应内容:
if (response.statusCode == 200) {
  print('响应原始内容: ${response.body}');
  // 后续逻辑
}

运行后查看控制台输出,确认是否真的返回了空内容。
2. 修正请求参数:将password参数改为与接口一致的adminAdmin,同时调整后端逻辑,账号密码校验失败时返回401状态码而非200,同步返回结构化的错误JSON提示。
3. 修正访问地址:

  • 安卓模拟器场景:将http://localhost:7777替换为http://10.0.2.2:7777
  • 真机调试场景:保证手机与电脑在同一局域网下,用电脑的局域网IP替换localhost
  1. 解决Flutter Web跨域问题:要么给后端接口配置CORS规则允许前端地址访问,要么调试阶段运行项目时添加禁用跨域的参数:
flutter run -d chrome --web-browser-flag "--disable-web-security"
  1. 增加健壮性判断,解析前先校验响应内容合法性:
if (response.statusCode == 200) {
  if (response.body.trim().isEmpty) {
    throw Exception('接口返回空响应');
  }
  try {
    final jsonData = jsonDecode(response.body);
    return users_model.Users.fromJson(jsonData);
  } catch (e) {
    throw Exception('JSON解析失败,错误:$e,响应内容:${response.body}');
  }
} else {
  throw Exception('请求失败,状态码:${response.statusCode}');
}

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

相关产品推荐
方舟 Agent Plan

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

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