Flutter使用Http发起Get请求报错无法取数,Postman正常如何排查?
问题根因
从报错信息可以看出,你的接口返回了拼接在一起的两段合法JSON结构,不是标准的单个JSON对象/数组,所以Dart的jsonDecode方法无法直接解析。Postman能正常显示,是因为Postman会自动做响应格式化处理,自动过滤或者拆分了异常拼接的内容,才看起来是正常的。
解决方案
你可以按以下步骤逐一排查修复:
- 第一步:先打印完整响应体确认内容
先把json解析的代码注释掉,直接打印response.body的完整内容,确认是否真的是两段JSON拼接的结构,同时也确认下实际的响应头Content-Type是否为application/json。
示例修改代码:Future fetchAlbum() async { final token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjI4OTksImlzcyI6Imh0dHBzOi8vcG9ydGFsLWFwaS5qb21ha2hhdGEuY29tL2FwaS9hdXRoL2xvZ2luIiwiaWF0IjoxNjMxMjUxNjYwLCJleHAiOjE2MzEzMzgwNjAsIm5iZiI6MTYzMTI1MTY2MCwianRpIjoiNlFEUTZCYnBMT0JhdUJoaSJ9.jAY_2nYxjgsIvXZY5vn0vAr_pwF6UBYbSGZ8wqD0YPQ'; final response = await http.get( Uri.parse('https://portal-api.jomakhata.com/api/getLeaveDetails?token=${token}'), ); // 先注释json解析,打印完整响应内容和状态码 print("响应状态码:${response.statusCode}"); print("完整响应体:${response.body}"); print("响应头Content-Type:${response.headers['content-type']}"); if(response.statusCode==200){ print("ok"); } else{ print("error!"); } return; } - 第二步:临时修复解析逻辑
如果确认是接口返回多段JSON拼接,你可以先通过字符串拆分的方式提取你需要的第一段合法JSON再解析,示例代码:String rawBody = response.body; // 找到两个JSON拼接的位置 int firstJsonEndIndex = rawBody.indexOf('}{'); // 提取第一段有效JSON String validJson = firstJsonEndIndex != -1 ? rawBody.substring(0, firstJsonEndIndex + 1) : rawBody; final responseJson = jsonDecode(validJson); - 第三步:彻底修复方案
这个问题本质是后端接口的返回异常,返回的内容里同时带了业务数据和SQL报错信息,你可以把完整的响应体发给后端开发,让后端排查接口逻辑,修正返回格式,只返回一段合法的JSON结构即可。
内容的提问来源于stack exchange,提问作者Fozuda
相关产品推荐
相关产品推荐

