我正在围绕我自己的 API 构建一个项目,到目前为止一切正常,但我想介绍 DELETE 的 UNDO 操作。
到目前为止,DELETE 是这样工作的:
DELETE /contacts/:id
我最初的 UNDO 是在同一个 url 上调用同一个 DELETE,这将取消已删除状态(如果此联系人处于已删除状态),但我不知道这是否是一个好方法。
我读了这篇看起来很相似的帖子,但是“结帐”部分给出了与我正在寻找的答案不同的答案。
我的建议好还是有更好的方法?
我正在围绕我自己的 API 构建一个项目,到目前为止一切正常,但我想介绍 DELETE 的 UNDO 操作。
到目前为止,DELETE 是这样工作的:
DELETE /contacts/:id
我最初的 UNDO 是在同一个 url 上调用同一个 DELETE,这将取消已删除状态(如果此联系人处于已删除状态),但我不知道这是否是一个好方法。
我读了这篇看起来很相似的帖子,但是“结帐”部分给出了与我正在寻找的答案不同的答案。
我的建议好还是有更好的方法?
如果您使用DELETE
后续请求删除了资源,则该资源应该返回404 NOT FOUND
,或者410 GONE
因为那里不再有资源可以接受请求。
PUT
如果可以接受并且您有可用的状态,最简单的答案是通过在已删除资源的 URL 处发出 a 来简单地重新创建资源。从语义上讲,这会创建一个新资源,替换任何现有状态,而不是真正撤消删除。
另一个简单的解决方案是承认您实际上并没有删除资源,而只是以某种方式更改它们的状态以显示它们已存档。这意味着您不能使用DELETE
动词,但您可以向资源发出PUT
或POST
请求以在存档状态和活动状态之间进行更改。
如果您想保留DELETE
作为删除记录的方法,那么可以选择使用特殊show-archived
值来访问存档资源:
GET /contacts/<id>?show-archived=true
在存档资源上指定此项将在存档资源上返回 a200
而不是其中一个40X
代码。这有点糊涂,因为您的资源现在有一个“超级状态”问题,即根据您如何观察它们,既存在又不存在。但是,这确实意味着您可以向资源发出请求以更新其状态:
PUT /contacts/<id>?show-archived=true
State=Active
... all other unchanged fields ...
如果是表示的一部分,我个人会在资源上使用UNDO DELETE
a ,如果不是,我会在资源上使用 a。PUT
deletion state
POST
action
那action
看起来像:
POST /contact/id/action/[recover|reactivate] (or whatever you think is more descriptive for the action).
但这只是我认为最RESTFul
合规的方式。