问题描述
我们目前正在创建一个网络应用程序来模拟 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 外观背后的实现细节。