资源
首先让我们来谈谈您将拥有哪些“资源”和“收藏”。
-
/users 和 /permissions 是一个不错的简单开始,它们分别是所有用户和所有权限的集合。
-
/users/{id} 和 /permissions/{id},它们分别是用户或权限的单个资源。
- 用户可能拥有“姓名”、“注册日期”、“身份证”等字段。
- 权限可能包含“名称”、“创建日期”、“ID”等字段。
到目前为止很好很简单。不管你从这里走到哪里,这两种类型的资源仍然作为独立的实体存在,一个用户可以没有权限,一个权限可以没有用户。但是现在我们需要将这些链接在一起吗?首先,让我们展示一个看似简单却让大多数人大吃一惊的概念......
/users/{id}/name 可用于仅返回基于 ID 的用户名。你没有有支持这种行为,如果你这样做了,那么你不应该直接将名称作为“用户”资源的一部分返回(你应该链接到这个特定的名称资源)。
这个概念也可以应用于权限。因此,我们还添加了/users/{id}/permissions,既可以作为可以调用GET 的资源,也可以作为通过/users/{id} 调用GET 的资源中的“链接”(因此hyper 开始使用 html 的一部分)。那么这会返回什么呢?可能是这样的:
/permission/3
/permission/666
/permission/7
这些资源是否“在”用户之下,不。他们需要吗,不。那么如果你GET 这些权限资源之一呢?
name=admin
id=666
created-date=12/3/45
users=/permission/666/users
最后一行,就像一个用户拥有一组权限一样,一个权限拥有一组拥有它的用户。 (我想你可以弄清楚那会是什么样子)
创建资源
在第一部分中,我介绍了这两种类型的资源如何相互关联。但是,您的问题更多是关于如何创建这些资源。显然,您可以允许操作员(我会说操作员以避免与“用户”资源混淆)创建用户,同时定义他们应该拥有的权限:
{ "name" : "Frank",
"permissions" : [
...
]
}
服务器会为您生成“id”和“sign-up-date”。权限列表可以允许使用“id”或“名称”,后者将要求服务器确保它们是唯一的并且还让服务器进行查找。此时唯一的问题是,如果“权限”是一个新名称……服务器会做什么?它可以很容易地创建它,但如果它是一个错字,或者只是一个大小写问题怎么办?
确实,它应该是 ID,并且这些应该在创建用户之前就已经存在。 GUI 可以帮助操作员找出这些 ID 是什么(提供“角色”名称列表,但知道如何发送带有 ID 的 POST 请求)。
作为旁注,请注意没有什么可以阻止创建没有权限的用户,并且可以在以后根据需要修改用户拥有的权限集合。
回答实际问题
它归结为两个简单的事情。首先,您可以有多个 URI 引用同一个资源; /permissions/666 可能是规范的 URI,但如果用户拥有该权限,您也可以通过 /user/{userID}/permissions/666 找到它,这两个 URI 可以引用服务器上的相同资源。
要考虑的第二件事,这确实使答案看起来很明显(尤其是在这个用例中)。您多久创建一次权限?您可能会制作 10 个,但随后将其中一些分配给数千名用户。因此,试图弄清楚如何在一个请求中处理创建权限和用户资源似乎是可耻的愚蠢。正如我认为我已经表明的那样,重复使用它不是问题。
TL;DR
您提出的第一个解决方案是可行的方法。
一个更具挑战性的话题是如何删除权限。来自单个用户或完全删除它。但是我已经讲了足够长的时间,所以也许另一个答案可以专门关注那个细节。