7

我正在围绕我自己的 API 构建一个项目,到目前为止一切正常,但我想介绍 DELETE 的 UNDO 操作。

到目前为止,DELETE 是这样工作的:

DELETE /contacts/:id

我最初的 UNDO 是在同一个 url 上调用同一个 DELETE,这将取消已删除状态(如果此联系人处于已删除状态),但我不知道这是否是一个好方法。

我读了这篇看起来很相似的帖子,但是“结帐”部分给出了与我正在寻找的答案不同的答案。

我的建议好还是有更好的方法?

4

2 回答 2

7

如果您使用DELETE后续请求删除了资源,则该资源应该返回404 NOT FOUND,或者410 GONE因为那里不再有资源可以接受请求。

PUT如果可以接受并且您有可用的状态,最简单的答案是通过在已删除资源的 URL 处发出 a 来简单地重新创建资源。从语义上讲,这会创建一个新资源,替换任何现有状态,而不是真正撤消删除。

另一个简单的解决方案是承认您实际上并没有删除资源,而只是以某种方式更改它们的状态以显示它们已存档。这意味着您不能使用DELETE动词,但您可以向资源发出PUTPOST请求以在存档状态和活动状态之间进行更改。

如果您想保留DELETE作为删除记录的方法,那么可以选择使用特殊show-archived值来访问存档资源:

GET /contacts/<id>?show-archived=true

在存档资源上指定此项将在存档资源上返回 a200而不是其中一个40X代码。这有点糊涂,因为您的资源现在有一个“超级状态”问题,即根据您如何观察它们,既存在又不存在。但是,这确实意味着您可以向资源发出请求以更新其状态:

PUT /contacts/<id>?show-archived=true

State=Active
... all other unchanged fields ...
于 2013-05-30T11:13:08.813 回答
1

如果是表示的一部分,我个人会在资源上使用UNDO DELETEa ,如果不是,我会在资源上使用 a。PUTdeletion statePOSTaction

action看起来像:

POST /contact/id/action/[recover|reactivate] (or whatever you think is more descriptive for the action).

但这只是我认为最RESTFul合规的方式。

于 2013-05-30T10:21:40.133 回答