在REST API中管理关系的创建和删除

在REST API中管理关系的创建和删除,rest,Rest,我们正在使用以下资源构建RESTAPI:用户、用户组。目前,我们支持以下URI: /BASEAPI/VERSION/Users/ /BASEAPI/VERSION/Users/{id}/UserGroups /BASEAPI/VERSION/UserGroups/ /BASEAPI/VERSION/UserGroups/{id}/Users 我喜欢这样做,而不是在对象中包含引用,然后在后续请求中必须提取这些引用。这也意味着我们可以避免使用查询参数来过滤结果。i、 e.我们不必支持: /BASE

我们正在使用以下资源构建RESTAPI:用户、用户组。目前,我们支持以下URI:

/BASEAPI/VERSION/Users/
/BASEAPI/VERSION/Users/{id}/UserGroups
/BASEAPI/VERSION/UserGroups/
/BASEAPI/VERSION/UserGroups/{id}/Users
我喜欢这样做,而不是在对象中包含引用,然后在后续请求中必须提取这些引用。这也意味着我们可以避免使用查询参数来过滤结果。i、 e.我们不必支持:

/BASEAPI/VERSION/UserGroups/{id}?user_id={user_id}
问题是,它没有使创建和删除语义非常清晰。i、 e.如果删除请求:

/BASEAPI/VERSION/Users/{id}/UserGroups/{group_id}

删除用户组,还是从用户组中删除用户

我们考虑添加:

/BASEAPI/VERSION/UserGroupUsers


但有些事情感觉不太对劲,但也许这是最好的办法。其他人认为什么是最佳实践?

您需要弄清楚如何表示用户和用户组之间的成员关系。它可以是用户的属性、组的属性或单独的资源。这些是唯一的选择。如何将用户添加到组中或从组中删除用户自然取决于您的选择。成员资格管理成为用户、组或成员资格资源的放置/删除操作


就我个人而言,我发现单独的资源是处理这个问题的最干净的方法,但是您需要查询参数来轮询特定的用户或组。此外,您还需要更改第二级资源名称,因为
/userGroups/{id}/users
返回
userGroupUsers
资源的集合是没有意义的。此URL上的
GET
返回资源,而
DELETE
删除资源。如果
DELETE
将删除与
GET
不同的内容,则返回的内容确实已损坏

因此,如果
/BASEAPI/VERSION/Users/4711/UserGroups
返回ID为0815和0816的用户组,则
DELETE
应同时删除这两个用户组

问题是:这有意义吗?两个用户组中的其他用户都发生了什么


如果您想从组中删除用户,我将提供一个
补丁
方法。

不使用查询参数有什么好处?我倾向于坚持您讨论的约定。这确实意味着我们可能必须添加UserGroupUsers作为一个单独的资源,并移动到查询参数,而不是将关系放入URI本身。您可以同时执行这两项操作,但要更清楚:我认为您的问题是删除,而不是URL。如果用户foo不再是组bar的成员,我会更新foo或bar,具体取决于谁持有引用。操作完成后,两个资源仍处于活动状态,因为您刚刚删除了一个关系-您没有删除资源。