带有firebase的Flutter HTTP包不适用于删除请求,但适用于发布,补丁和获取?

Posted

技术标签:

【中文标题】带有firebase的Flutter HTTP包不适用于删除请求,但适用于发布,补丁和获取?【英文标题】:Flutter HTTP package with firebase not working for delete request, but working for post, patch and fetch? 【发布时间】:2021-08-14 04:07:39 【问题描述】:

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

我有一个实时数据库,它存储(截至目前)产品列表。 我的代码中的addProductupdateProduct 方法运行良好。但由于某种原因,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
  

【问题讨论】:

您是否有理由使用 REST API 而不是 Flutter 的官方 FIrebase SDK? @TarikHuber 实际上我为 Flutter 购买的课程使用 REST API 来教授后端,所以我现在只是关注它。稍后当我对后端感到更舒服时,我将继续使用 Firebase SDK。 老实说,我不会为您推荐该解决方案。 REST API 适用于没有原生 SDK 的用例。 Flutter 绝对有一个非常好的你可以使用的。如果您继续使用这种方法,您将需要双重工作,因为您无法重用您使用 REST API 制作的任何内容。而且 Firebase 中最好的东西,比如实时监听器,不在 REST API 中。身份验证是 REST API 的一大难题。在没有原生 SDK 的情况下,这只是一个 B 方案。 如果你愿意,我可以和你分享一些代码 sn-ps,你可以开始使用 SDK。 好的,我会切换到 SDK。谢谢你的帮助!我会在几个小时内删除这篇文章 【参考方案1】:

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

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

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

应该是shop 而不是sdhp

【讨论】:

我会这样做,但我的原始代码有什么问题:'( 如果数据库规则完全开放,我只能想象变量productId 没有按预期设置。您也可以与我们分享您的规则吗? 我已经用数据库规则更新了我原来的问题 它们看起来不错。值productId 设置了吗?它是否打印有效的 ID? 是的,与 Firebase 上的 ID 相同。

以上是关于带有firebase的Flutter HTTP包不适用于删除请求,但适用于发布,补丁和获取?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter http 包不存在

是啥导致“权限被拒绝”-带有 FIREBASE 和 FLUTTER 的消息

Flutter:带有 patform 通道的 Firebase 消息传递 - 重复的 FlutterActivity

带有 WebView 的 Flutter 应用中的 Firebase 身份验证

带有 Firebase 云消息传递的 Flutter 2.0:onMessage 未在 Android 上调用

Firebase Cloud Messaging 无法在带有 Flutter 应用程序的 Android 上运行