Api 如何撤消删除操作并遵守RESTful标准?

Api 如何撤消删除操作并遵守RESTful标准?,api,rest,design-patterns,Api,Rest,Design Patterns,我正在围绕我自己的API构建一个项目,到目前为止一切都正常,但我想为DELETE引入撤销操作 到目前为止,删除的工作方式如下: DELETE /contacts/:id 我对撤销的最初想法是在同一url上调用相同的DELETE,这将取消已删除状态(如果此联系人处于已删除状态),但我不知道这是否是一种好方法 我读到的内容看起来很相似,但“结帐”部分给出的答案与我所寻找的不同 我的建议是好的还是有更好的方法?如果删除状态是表示的一部分,我个人会将撤消删除放在资源上,如果不是,则在操作上发布 该操作

我正在围绕我自己的API构建一个项目,到目前为止一切都正常,但我想为DELETE引入撤销操作

到目前为止,删除的工作方式如下:

DELETE /contacts/:id
我对撤销的最初想法是在同一url上调用相同的DELETE,这将取消已删除状态(如果此联系人处于已删除状态),但我不知道这是否是一种好方法

我读到的内容看起来很相似,但“结帐”部分给出的答案与我所寻找的不同


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

如果
删除状态是表示的一部分,我个人会将
撤消删除
放在资源上,如果不是,则在
操作上发布

操作将如下所示:

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

但这正是我认为最符合RESTFul的方式。

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

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

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

如果要保留
DELETE
作为删除记录的方法,则可以使用特殊的
show archived
值来访问存档资源:

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

显然,在url中使用动词不是RESTFul标准。谓词只能出现在方法+1中-另一个细微的变化是补丁,因为您在逻辑上只是更新部分资源(在本例中,它是已删除/已存档状态)
PATCH
非常适合这种类型的请求,但是对它的支持不同;对于HTTP谓词家族来说,这是非常新的。
PUT /contacts/<id>?show-archived=true

State=Active
... all other unchanged fields ...