Flutter调试遇FormatException错误,请求返回HTML而非JSON求助
解决Flutter中FormatException(返回HTML而非JSON)问题
你的错误核心是接口返回的是HTML内容而非预期的JSON,所以jsonDecode无法解析导致抛出异常。以下是具体解决步骤:
第一步:打印返回内容,定位具体原因
在调用jsonDecode之前,先把响应体完整打印出来,看这个HTML是错误页面、登录跳转页还是其他内容,快速定位问题根源:Future<AccademicCertModel> GetCert() async { SharedPreferences pref = await SharedPreferences.getInstance(); var token = pref.getString('token'); var headers = {'Authorization': 'Bearer $token'}; var request = http.Request( 'GET', Uri.parse('$baseUrl/api/user/training-certificates/get')); request.headers.addAll(headers); http.StreamedResponse response = await request.send(); // 新增:打印响应体内容 String responseBody = await response.stream.bytesToString(); print('接口返回内容:$responseBody'); if (response.statusCode == 200) { return AccademicCertModel.fromJson(jsonDecode(responseBody)); } else { // 非200状态下禁止解析JSON,直接抛出错误 throw Exception('请求失败,状态码:${response.statusCode},返回内容:$responseBody'); } }第二步:修正错误的状态码处理逻辑
你当前代码不管状态码是否为200,都强制解析JSON,这是错误的。非200状态(如401、404、500)下,服务器通常返回错误HTML页面,自然无法解析成JSON,必须分开处理。第三步:排查常见触发原因
- Token无效/过期:如果
token为空、过期或格式错误,服务器可能返回登录跳转页面(HTML)。可以打印token确认值是否正确,或检查token的有效期。 - 接口URL错误:确认
$baseUrl拼接后的完整URL是否正确,检查路径拼写、大小写、是否遗漏/多余斜杠。 - 请求头格式错误:确保
Authorization头格式为Bearer 你的token,注意Bearer和token之间有一个空格,避免出现Bearer null(当token为空时)的无效格式。
- Token无效/过期:如果
内容的提问来源于stack exchange,提问作者Usama Qadeer
相关产品推荐
相关产品推荐

