【问题标题】:REST Design: Adding/Deleting a related entity from a given entity using RESTREST 设计:使用 REST 从给定实体添加/删除相关实体
【发布时间】:2014-01-25 06:20:23
【问题描述】:

假设我有一个用户组,我想在该组中添加/删除用户。我感到困惑的是设计网址的最佳实践是什么。以下是选项

选项#1

POST /groups/{groupId}/users -- 请求正文将包含 userId DELETE /groups/{groupId}/users/{userId} -- userId 将在路径中,请求正文将为空

选项#2

DELETE /groups/{groupId}/users -- 请求正文将包含 userId POST /groups/{groupId}/users/{userId} -- userId 将在路径中,请求正文将为空

我相信两个答案都是正确的,我猜这里没有正确或错误的答案,只是个人喜好。但我想知道什么是广泛使用的。我一直在使用 OPTION # 1,因为我在某本书中读到(这个名字让我无法理解)你是 POSTing 的数据不应该是 url 的一部分,而使用 DELETE 时没有这样的最佳 -练习克制。

感谢所有输入!

【问题讨论】:

    标签: rest jersey jax-rs restful-architecture


    【解决方案1】:

    第一个选项是最常见的,但这没有任何意义,因为对 REST 的误解很普遍。事实上,#1 根本不是 REST,它是纯粹而简单的 RPC。

    可以通过POST 向集合/groups/{groupId}/users 添加成员到集合中,在Location 响应标头中返回创建资源的位置,或者通过PUT 请求到最终位置/groups/{groupId}/users/{userId}POST 应该返回一个 201 Created 响应,而 PUT 或者 200 OK,如果资源已经存在并被新资源替换。

    要删除,正确的方法是使用DELETE /groups/{groupId}/users/{userId}。这不是个人喜好问题。 POST 是一种用于 HTTP 协议未标准化的操作的方法。简单删除通过DELETE 方法标准化。通过POST 方法实现它仅仅意味着您必须记录该功能,而不是依赖标准本身。仅当您在删除期间做一些花哨的事情时才使用POST,这些事情已经需要记录功能。

    【讨论】:

      【解决方案2】:

      选项 1 似乎是最常见的一种。我完全没有感觉选项2有效!

      【讨论】:

      • 感谢您的意见!即使请求正文中的唯一内容是用户的 ID,您是否认为选项 1 仍然有效?
      • 发送DELETE 请求时不需要在请求正文中添加任何内容,因为请求URI 已经包含userId。只有 POSTPUT 请求应该有请求正文。
      • @xmenymenzmen HTTPbis 规范不允许您使用 DELETE 请求的正文。 tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-25#page-29
      • 最常见并不意味着它是正确的。选项 #2 有效且正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      相关资源
      最近更新 更多