带有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 的新手,所以请多多包涵。
我有一个实时数据库,它存储(截至目前)产品列表。
我的代码中的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
【问题讨论】:
您是否有理由使用 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包不适用于删除请求,但适用于发布,补丁和获取?的主要内容,如果未能解决你的问题,请参考以下文章
是啥导致“权限被拒绝”-带有 FIREBASE 和 FLUTTER 的消息
Flutter:带有 patform 通道的 Firebase 消息传递 - 重复的 FlutterActivity
带有 WebView 的 Flutter 应用中的 Firebase 身份验证