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

Flutter调用API时偶发FormatException错误求助

问题排查与解决方案

核心原因分析

偶发返回<!DOCTYPE html>并触发FormatException,说明服务器并非每次都返回预期的JSON响应,而是在某些场景下返回了HTML错误页面(比如404、500、重定向页面),导致JSON解析失败。常见触发场景:

  • 服务器负载过高、临时故障,返回5xx错误页面
  • URL拼接偶发错误,请求了不存在的资源(404页面)
  • 请求Headers/参数偶发不符合接口要求,服务器返回权限/参数错误的HTML页面
  • 网络波动导致请求被拦截,返回缓存的错误页面

代码优化与排查步骤

1. 完善错误捕获与日志打印

先修改代码,捕获异常并打印完整响应细节,这样出错时能明确服务器返回的具体内容:

try {
  http.Response response = await http.post(
    Uri.parse(url + 'testMe.php'),
    headers: headers,
    body: body,
  );
  // 打印关键调试信息
  print('Status Code: ${response.statusCode}');
  print('Response Headers: ${response.headers}');
  print('Response Body: ${response.body}');

  // 仅当响应状态码正常时才解析JSON
  if (response.statusCode >= 200 && response.statusCode < 300) {
    if (response.body.isNotEmpty) {
      // 注意:无需json.encode再decode,直接解析原字符串即可
      final parsedData = json.decode(response.body);
      print('Parsed Data: $parsedData');
    } else {
      print('Response is empty...');
    }
  } else {
    print('Server Error: Status Code ${response.statusCode}');
  }
} catch (e) {
  print('Exception: $e');
}

2. 针对性排查方向

  • 检查URL拼接逻辑:确保url末尾始终带有斜杠,或者用Uri.https/Uri.join安全拼接路径,避免出现urltestMe.php这类无效路径(会返回404 HTML)
  • 对齐Postman与Flutter的请求参数:对比两者的Headers(比如Content-Type、Cookie、Authorization)、请求体格式,确保Flutter每次请求都携带了和Postman完全一致的参数
  • 查看服务器日志:如果有权限,检查服务器端testMe.php的访问日志,看报错时的请求是否存在参数错误、权限问题或服务器内部异常
  • 处理重定向:如果服务器存在重定向,可手动检查重定向后的地址是否返回HTML,必要时禁用自动跟随重定向(http.post默认跟随)

额外注意点

你代码里的json.decode(json.encode(response.body))是冗余操作:json.encode会把字符串转成JSON格式的字符串(比如把{"a":1}变成"{\"a\":1}"),再decode会得到原字符串,根本没有解析JSON数据,这是一个无效操作,直接用json.decode(response.body)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:50:23