使用 DELETE 或 PUT 删除数据库中的外键?

问题描述

我们目前正在创建一个网络应用程序来模拟 flickr 作为一个项目的工作方式。

在这个应用程序中,我们有一个画廊和照片。

在每个画廊中,我们将照片 ID 存储在一个数组中。

gallery.photos = [ photoId1,photoId2,photoId3 ]

如果我们想从图库中删除照片,但是该照片会保留在数据库中,如果您转到用户的个人资料而不是从图库中可以访问该照片。

因此,如果我们执行 DELETE url/gallery/photos/photoId3后执行 GET url/gallery/photos/photoId3,它将返回一个 Error 404

关于我们应该使用 DELETE 还是 PUT 目前存在争论。

有人说DELETE,因为我们正在删除内容并且无法从该网址访问照片。

其他人说 PUT,因为我们只是在编辑照片 ID 列表。

那么,我的问题是,对于这个问题,是否有一个共同的约定?

解决方法

关于这个问题有没有共同的约定?

需要注意的重要一点是 DELETE 和 PUT 属于 transfer of documents over a network 域。

我们以标准方式使用标准方法,以便通用组件可以理解消息的含义并执行智能操作。

如果请求的语义是“目标 uri 应该用 404 响应 GET 请求”,那么 DELETE 是合适的。您的实现如何实现这一点的基本细节无关紧要。

请注意,DELETE 的定义对于语义的限制非常明确

如果目标资源有一个或多个当前表示,它们可能会或可能不会被原始服务器销毁,并且相关联的存储可能会或可能不会被回收,这完全取决于资源的性质及其由源服务器的实现源服务器(超出了本规范的范围)。


事情变得非常混乱的地方:HTTP 使我们就消息语义的含义达成一致,但不限制实现。特别是,一个资源的 DELETE 也会改变其他资源的表示,反之亦然,这是完全有效的。

想象一下,如果您愿意,画廊是一个网页 (/gallery/1/photos/webpage.html),带有指向图像的链接,包括指向 /gallery/1/photos/3 的链接。

DELETE  /gallery/1/photos/3

这会删除 URI 和图像数据之间的关联,但它不会(必然)更改网页,因此您会得到一个断开的链接。

PUT /gallery/1/photos/webpage.html

这会将链接从网页中取出,但当然仍然可以通过其 URI 直接访问图像。

(注意:如果您的个人资料使用与您的画廊相同的图像 URI,那么这更有可能是您想要使用的模型。我们从该网页中删除链接,但不会从个人资料中删除.html。DELETE 将为链接到图片的所有网页生成 404。

如果你想要两者 - 当 DELETE 发生时,网页应该自动更新,反之亦然 - 你可以在你的实现中做到这一点(副作用是允许的)。但是......通用组件不一定知道这两件事都发生了。例如,当您删除图像时,通用缓存不会知道网页已更改。它不会知道您在编辑网页时删除了图片。

也就是说,我们没有一种标准的方法来包含在 HTTP 响应元数据中,以描述已被请求更改的其他资源。

当然,您可以在响应中包含该信息,以便定制组件可以执行智能操作。

DELETE /gallery/1/photos/photoId3

200 OK
Content-Type: text/plain

Deleted: /gallery/1/photos/photoId3
Changed: /gallery/1/photos/webpage.html

GET /gallery/galleryId/photos/photoId3 将返回错误 404,因为照片不在该画廊中,但是假设您拥有正确的权限,GET /photos/photoId3 仍会返回照片

好消息:通用组件不知道 /gallery/galleryId/photos/photoId3/photos/photoId3 之间存在任何关系。同样,他们在幕后共享信息这一事实是隐藏在 HTTP 外观背后的实现细节。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...