Raf*_*zia 5 api rest api-design relationship
我正在创建一个基于REST概念的API,但我仍然有点困惑谈论相关资源.
我有一个网站,人们可以在多个组中注册并选择多个角色.例如,让我们将在公司注册的人作为场景:
公司
角色
因此,当我想在具有特定角色的新公司中创建用户时,我会将类似的内容传递给对/ users端点的POST请求
{
"username" : "raffaele.izzia",
"email" : "example@email.com",
"groups" : [{
"id" : 1,
"roles" : ["Sales","Customer support"]
},
{
"id" : 2,
"roles" : ["Sales","Marketing"]
}]
}
Run Code Online (Sandbox Code Playgroud)
通过这种方法,一旦我从API获得一些用户,我总是知道他们是哪些组/角色.
但是对于/ groups端点的请求呢?
如果我GET/groups/google我也应该收到有关用户/角色的信息.所以它可能是这样的
{
groups: [{
"id" : 2,
"name" : "Google",
"users" : [2,3,4,10,35,50] //role will be included in the single resource once you expand this collection
}]
}
Run Code Online (Sandbox Code Playgroud)
或者这个:
{
groups: [{
"id" : 2,
"name" : "Google",
"roles" : [{
"name" : "Sales"
"users" : [2,3,4,10]
},{
"name" : "Marketing"
"users" : [4,10,8,57]
}]
}]
}
Run Code Online (Sandbox Code Playgroud)
您认为这种关系的最佳解决方案是什么?
这是一个很好的问题。绝对是一个棘手的情况。
我认为典型的 RESTful 答案是根据名词(AKA 资源)进行思考。即使您将这种三向连接视为名词之间的关系,连接本身也是一个名词。这就是您希望 REST API 公开的内容。
由于缺乏更好的术语,您的连接的名称可能是分配(或分配,或其他)。例如,“Alice 为 Google 从事营销工作”是一项作业。
这现在开辟了新的可能性,应该可以满足您的需求。
例如一个赋值对象:
{
"id": "...",
"user": {...}, // e.g. Alice
"group": {...}, // e.g. Google
"role": "Marketing"
}
Run Code Online (Sandbox Code Playgroud)
fetching/users/alice/assignments
返回她所有作业的列表。
类似地,fetching 会/groups/google/assignments
为在 Google 工作的人返回所有分配对象的列表。
这样做的好处是现在您的作业确实是一流的。您现在可以执行诸如跟踪旧分配之类的操作,同时让您的主要 API 仅返回当前分配。等等(这个答案的道具在这里获得灵感。)
希望这可以帮助!
归档时间: |
|
查看次数: |
1041 次 |
最近记录: |