更新与REST的多对多关联
我有三种不同的模型,分别是更新与REST的多对多关联,rest,restful-architecture,restful-url,api-design,httpverbs,Rest,Restful Architecture,Restful Url,Api Design,Httpverbs,我有三种不同的模型,分别是User、PermissionSet和Permission。这些模型分别表示它们的SQL表 用户有多对一关联权限集,用户可能有一个权限集或没有PermissionSets将由一个或多个Users所有 PermissionSet与Permissions有多对多关联。一个权限可以由多个权限集s或无所拥有,其中权限集s可以拥有多个权限s或根本没有 所以我创建了四个表:用户,权限集,权限和一个连接表,权限集 我需要保留在用户的权限集中所做的更改。这由名为PermissionSe
User
、PermissionSet
和Permission
。这些模型分别表示它们的SQL表
用户
有多对一关联权限集
,用户可能有一个权限集
或没有PermissionSet
s将由一个或多个User
s所有
PermissionSet
与Permission
s有多对多关联。一个权限
可以由多个权限集
s或无所拥有,其中权限集
s可以拥有多个权限
s或根本没有
所以我创建了四个表:用户
,权限集
,权限
和一个连接表,权限集
我需要保留在用户的权限集中所做的更改。这由名为PermissionSetGrant
的模型处理,该模型有自己的表permission\u set\u grants
使用基于HTTP和JSON的RESTful API更改权限集
的权限的最佳方法是什么
例如,使用这样的请求修改PermissionSet
是否是一种好方法:
PUT /api/v1/permission_sets/7
// Payload
{
"permission_set": {
// Assume these properties of the entity aren't changed
"name": "default",
"description": "Default permission set.",
// Here we're changing the permissions
"permission_ids": [
24,
27,
35
]
}
}
-> 200 OK
或者改为使用额外的REST路径添加权限
POST /api/v1/permission_sets/7/permissions
// Payload
{
"permission": 24
}
-> 201 CREATED
当我们需要删除该权限时
DELETE /api/v1/permission_sets/7/permissions/24
-> 203 ACCEPTED
我还要补充一点,从客户机的角度来看,请求是幂等的和确定性的。权限数至少为100。因此,批处理操作将在第二种方法中执行。如果您要立即允许更新如此大量的权限,那么补丁可能是您的朋友:
从客户端的角度来看(定义了补丁标准),API可以像
PATCH /api/v1/permission_sets/7
[
{ "op": "add", "path": "/permission_ids", "value": [ "24", "27", "35" ]}
]
然而,不幸的是,补丁
不是一种方法(也不是POST
,原因几乎相同),因此通过排除,您只剩下PUT
,这很好,只是比补丁
更详细一点(客户端必须放置整个对象,包括整个权限ID集合)。我认为您当前的解决方案是可以的。如果您都想将权限与权限集连接起来,那么您可以使用多个ID来描述集合,而不是使用相同的负载,例如
PUT /api/v1/permission_sets/1+2+3/permissions/4+5+6/
DELETE /api/v1/permission_sets/1+2+3/permissions/4+5+6/
如果我是你,我就不会被层次化URI设计所束缚,这在大多数情况下是不方便的
PUT /api/v1/permissions/4+5+6/into/permission/sets/1+2+3/
DELETE /api/v1/permissions/4+5+6/from/permission/sets/1+2+3/
请注意,URI设计没有REST约束,因为和机器客户端。因此,从客户端的角度来看,只要可以用URI模板描述URI,URI的结构就无关紧要。唯一需要记住的是,URI和资源之间存在n:1关系,因此多个URI可以识别他使用相同的资源,但单个URI无法标识多个资源