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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:33:24