更新与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无法标识多个资源