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

Flutter请求firebase接口抛FormatException异常无法解析返回数据

报错根因

Unhandled Exception: FormatException: Unexpected character 报错的核心原因是 json.decode() 方法接收到的输入不是合法JSON格式。你的场景下,基本是请求Firebase Realtime Database时被权限规则拦截,返回了HTML格式的错误页面,而非预期的JSON数据,所以解码失败。

解决步骤

  1. 确认响应内容
    先在请求后新增打印逻辑,确认返回内容和状态码:
Future<void> fetchAndSetProduct() async {
  final url = Uri.https('shopda-83b00-default-rtdb.firebaseio.com', '/products');
  try {
    final response = await http.get(url);
    // 新增两行打印确认响应
    print("响应状态码:${response.statusCode}");
    print("响应内容:${response.body}");
    if (response.statusCode != 200) {
      throw Exception("请求失败,状态码:${response.statusCode}");
    }
    final extractData = json.decode(response.body);
    // 空值判断,避免数据库无数据时报错
    if (extractData == null) {
      _items = [];
      notifyListeners();
      return;
    }
    // 类型校验,避免强转异常
    if (extractData is! Map<String, dynamic>) {
      throw Exception("响应数据格式错误");
    }
    final List<Product> loadedProduct = [];
    extractData.forEach((prodId, prodData) {
      loadedProduct.add(Product(
        id: prodId,
        title: prodData['title'],
        description: prodData['description'],
        price: prodData['price'],
        isFavourite: prodData['isFavourite'],
        imageUrl: prodData['imageUrl']
      ));
    });
    _items = loadedProduct;
    notifyListeners();
  } catch (error) {
    rethrow;
  }
}

如果打印的响应内容包含<html>等HTML标签、状态码为401/403,即可确认是权限问题。

  1. 修复权限规则(测试用)
    登录Firebase控制台,进入对应项目的Realtime Database页面,切换到「规则」标签,修改为以下配置后发布,即可临时允许未认证读写:
{
  "rules": {
    ".read": true,
    ".write": true
  }
}

注意:该配置仅用于本地测试,上线前必须重新配置权限规则,避免数据泄露。

  1. 带认证请求(正式场景)
    如果业务要求用户登录后才能操作数据,需要在请求头中携带Firebase Auth返回的用户ID Token:
final response = await http.get(url, headers: {
  'Authorization': 'Bearer ${当前登录用户的IdToken}'
});

内容的提问来源于stack exchange,提问作者Rasathurai Karan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:06:02