2014-01-23 49 views
0

让我们假设我有一组用户,并且希望从组中添加/删除用户。我感到困惑的是设计这个网站的最佳做法是什么。以下是选项REST设计:使用REST从给定实体添加/删除相关实体

选项#1

POST /组/ {的groupId} /用户 - 请求体将包含用户id DELETE /组/ {的groupId} /用户/ {用户id} - - 用户标识将在路径和请求体将是空的

选项#2

DELETE /组/ {的groupId} /用户 - 请求体将包含用户id POST /组/ {}的groupId /用户/ {} userId的 - 用户ID将在路径和请求主体将是空

我相信这两个问题的答案是正确的,我猜是没有对或错的答案在这里,只是个人喜好。但我想知道什么是广泛使用。我一直在使用OPTION#1,因为我在某本书中读到(这个名字让我感到沮丧),那么当您使用DELETE时,POST ing的数据不应该是url的一部分,因此没有这种最佳实践限制。

所有输入都赞赏!

回答

0

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

+0

感谢您的意见!即使请求主体中的唯一内容是用户的ID,您是否认为选项#1仍然有效? – shahshi15

+0

发送DELETE请求时,你不需要在请求体中放置任何东西,因为请求URI已经包含'userId'。只有'POST'和'PUT'请求应该有一个请求体。 –

+1

@xmenymenzmen HTTPbis规范不允许使用DELETE请求的主体。 http://tools.ietf.org/html/draft-ietf-httpbis-p2-semantics-25#page-29 –

2

第一种选择是最常见的,但这并不意味着什么,因为对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,这些操作已经要求将功能记录在案。