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
相关产品推荐
相关产品推荐

