删除写保护资源的 Restful 方式

Restful way to delete a write-protected resource

提问人:Cephalopod 提问时间:1/13/2023 更新时间:1/13/2023 访问量:61

问:

在我的 API 中,资源可以进行写保护。尝试删除此类资源将返回 409(冲突)响应。

对于允许更改资源的受保护状态的用户,我想引入一个请求即可删除受保护资源的选项。应该如何通过此选项?

可能的解决方案:

  • 请求正文 -- 不应用于删除请求
  • 查询参数 -- 更改 URI,因此从技术上讲指的是不同的资源
  • 自定义标头 -- 通常不建议使用
  • 标准标头 -- 无适用
  • 两个请求 -- 不是原子的,事情可能发生在两者之间(例如,另一个用户修改资源)
  • 替代端点 -- 不是 restful?

相关问题

REST HTTP 语言无关

评论


答:

1赞 VoiceOfUnreason 1/13/2023 #1

对于允许更改资源的受保护状态的用户,我想引入一个请求即可删除受保护资源的选项。应该如何通过此选项?

如果请求消息的含义与 HTTP DELETE 一致,那么您可能应该只使用 HTTP DELETE,而不是尝试发明一种方言来区分 DELETE 和 no-no-I-really-mean-it-DELETE。

您的消息语义是否与 HTTP DELETE 一致?您可能需要在 RFC 9110 中考虑此观察结果

允许使用 DELETE 方法的资源相对较少 -- 它的主要用途是用于远程创作环境,用户对其效果有一定的指导。

DELETE 是我们希望 Web 服务器停止共享资源表示形式时发送到该服务器的方法令牌。它的语义植根于通过网络域传输文档


另一方面,如果消息与 HTTP DELETE 不一致,则应考虑使用 HTTP POST。

POST 在 HTTP 中有许多有用的用途,包括“此操作不值得标准化”的一般目的。 -- Fielding,2009


以下是考虑这种区别的一种方式:我们创建“REST API”的目标是创建一个外观,将我们的域服务伪装成可感知 HTTP 的文档存储。

如果客户真正在做的是将文档标记为隐藏在存储中;作为副作用,我们可能会在域服务中进行一系列更改,那么 DELETE 是合适的。

另一方面,如果客户端真正要做的是将信息发送到我们的域服务,并且作为副作用,某些文档将被隐藏,那么 POST 是合适的。