api - 如何撤消 DELETE 操作并遵守 RESTful 标准?

标签 api rest design-patterns

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

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

DELETE /contacts/:id

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

我读了 this post看起来很相似,但“结帐”部分给出了我正在寻找的其他答案。

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

最佳答案

如果您使用 DELETE 删除了资源对该资源的后续请求应返回 404 NOT FOUND410 GONE因为 那里不再有资源来接受请求。

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

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

如果您想保留 DELETE作为删除记录的方法,一个选项是通过使用特殊的 show-archived 来访问存档资源成为可能。值(value):

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

在存档资源上指定此项将返回 200在存档资源上而不是 40X 之一代码。这有点麻烦,因为您的资源现在有一个“超状态”问题,即存在和不存在都取决于您观察它们的方式。但是,这确实意味着您可以向资源发出请求以更新其状态:
PUT /contacts/<id>?show-archived=true

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

关于api - 如何撤消 DELETE 操作并遵守 RESTful 标准?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832688/

相关文章:

java - 需要初始化对象时使用的设计模式?

c# - 使用 C# 实现 Catia V5 自动化

node.js - Rest API - 如何以正确的方式提供数据

Jboss 7.1中的RestEasy Jax-RS不起作用

sql - 实现字段更改跟踪的模式

c# - 在派生类中添加属性

Android 开发 : API to find Rss-Feeds

api - 我可以使用 API 将一个待办事项移动到另一个待办事项列表吗?

c# - disqus API 缺少必需的参数 : grant_type

Java map 中的 map ,REST Web 服务