首页 > 解决方案 > 带有firebase的Flutter HTTP包不适用于删除请求,但适用于发布,补丁和获取?

问题描述

我是 Flutter 和 Firebase 的新手,所以请多多包涵。

我有一个实时数据库,它存储(截至目前)产品列表。我的代码中的addProduct, 和updateProduct方法工作正常。但由于某种原因,deleteProduct不是。当我尝试通过 URL 访问数据库时,它给了我一个 404 错误,即使完全相同的 URL 正在为该updateProduct函数工作。

这是代码updateProduct

    final _productIndex =
        _items.indexWhere((element) => element.id == productId);
    if (_productIndex >= 0) {
      final url = Uri.parse(
          "https://flutter-shop-app-f1b23-default-rtdb.firebaseio.com/products/$productId.json");
      return http
          .patch(url,
              body: json.encode({
                "title": newProduct.title,
                "description": newProduct.description,
                "imageUrl": newProduct.imageUrl,
                "price": newProduct.price,
              }))
          .then((_) {
        _items[_productIndex] = newProduct;
        notifyListeners();
      });
    } else {
      print("ERROR");
    }

    return Future(null);
  }

这是代码deleteProduct

Future<void> deleteProduct(String productId) {
    print(productId);
    final url = Uri.parse(
        "https://flutter-sdhop-app-f1b23-default-rtdb.firebaseio.com/products/$productId.json");
    print(url.toString());
    return http.delete(url).then((response) {
      print(response.statusCode);
      print(response.body);
      if (response.statusCode >= 400) {
        throw HttpException("Could not delete!");
      }
      _items.removeWhere((element) => element.id == productId);

      notifyListeners();
    });
  }

这是(打印的)错误消息:

I/flutter ( 5104): 404
I/flutter ( 5104): {
I/flutter ( 5104):   "error" : "404 Not Found"
I/flutter ( 5104): }

我尝试在浏览器窗口中打开 URL,并得到相同的 404 错误,这令人费解,因为 Flutter 似乎能够访问它进行更新而没有任何问题。firebase 项目是在测试模式下创建的,所以我认为身份验证不会成为这里的问题。

请帮助解决此问题。

以下是数据库规则:

{
  "rules": {
    ".read": "now < 1624300200000",  // 2021-6-22
    ".write": "now < 1624300200000",  // 2021-6-22
  }
}

标签: firebaseflutterrestdartfirebase-realtime-database

解决方案


老实说,我不会为您推荐该解决方案。REST API 适用于没有原生 SDK 的用例。Flutter 绝对有一个非常好的你可以使用的。如果您继续采用这种方法,您将需要双重工作,因为您无法重用您使用 REST API 制作的任何内容。而且 Firebase 中最好的东西,比如实时监听器,不在 REST API 中。身份验证是 REST API 的一大难题。在没有原生 SDK 的情况下,它只是一个 Plan B 解决方案。

在删除链接中,您有一个错字:

https://flutter-sdhop-app-f1b23-default-rtdb.firebaseio.com/products/

它应该是shop而不是sdhp


推荐阅读