Flutter HTTP POST请求问题:无法显示Heroku返回的公交ETA数据
排查Flutter POST请求无法显示公交ETA数据的问题
按以下步骤逐一定位问题:
1. 先确认请求是否成功获取数据
在你的POST请求代码中添加打印语句,输出响应状态码和响应体,明确服务器实际返回的内容:
final response = await http.post(/* 你的请求配置 */); print('状态码:${response.statusCode}'); print('响应体:${response.body}');
- 若状态码不是200,说明请求本身存在问题(比如URL错误、请求参数缺失、服务器权限限制),优先解决请求成功的问题。
- 若状态码是200,但响应体为空数组或非预期格式,说明服务器未返回正确数据,需先排查Heroku接口的逻辑。
2. 修正JSON解析逻辑
你的服务器返回的是数组格式的JSON,不能直接按单个对象解析。以下是正确的解析和弹窗展示逻辑示例:
if (response.statusCode == 200) { List<dynamic> responseData = jsonDecode(response.body); // 检查数组是否包含数据 if (responseData.isNotEmpty) { var busInfo = responseData[0]; String busNo = busInfo['bus_service_no']; List<dynamic> etaList = busInfo['eta']; // 拼接要显示的ETA文本 String displayText = ''; for (var eta in etaList) { displayText += '• 绝对时间:${eta['time']},还有${eta['relative_time']}秒到站\n'; } // 弹窗展示数据 showDialog( context: context, builder: (ctx) => AlertDialog( title: Text('公交$busNo 到站信息'), content: Text(displayText), actions: [ TextButton( onPressed: () => Navigator.pop(ctx), child: const Text('确定') ) ], ) ); } else { // 数组为空时显示提示 showDialog( context: context, builder: (ctx) => AlertDialog(content: const Text('No data available')) ); } }
3. 检查请求配置是否合规
- 确认Heroku接口的URL是否正确,是否需要添加特定请求头(比如
Content-Type: application/json)。 - 如果POST请求需要携带参数(比如站点ID、线路号),确保请求体格式与服务器要求一致,用
jsonEncode正确序列化参数:
body: jsonEncode({'station_id': '123', 'route_no': '7'})
4. 排查服务器端问题
如果用Postman/curl调用Heroku接口也无法返回示例中的JSON数据,说明问题出在服务器端:
- 查看Heroku服务器日志,排查请求处理时的错误。
- 确认服务器数据库中是否存在对应线路的ETA数据。
内容的提问来源于stack exchange,提问作者katamykenji
相关产品推荐
相关产品推荐

