首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用REST更新多对多关联

使用REST更新多对多关联
EN

Stack Overflow用户
提问于 2016-09-18 22:33:20
回答 2查看 484关注 0票数 3

我有三种不同的型号,分别是UserPermissionSetPermission。这些模型分别表示它们的SQL表。

User有一个多对一关联PermissionSet,一个用户可以有一个PermissionSet,也可以没有。PermissionSet%s将归一个或多个User%s所有。

PermissionSetPermission%s具有多对多关联。一个Permission可以由多个PermissionSet拥有,也可以不拥有,其中PermissionSet%s可以拥有多个Permission,也可以根本不拥有。

所以我创建了四个表:userspermission_setspermissions和一个连接表permission_sets_permissions

我需要持久化在UserPermissionSet中所做的更改,这是由一个名为PermissionSetGrant的模型处理的,该模型有自己的表permission_set_grants

使用HTTP和JSON更改PermissionSetPermission的最佳方式是什么?

例如,使用这样的请求修改PermissionSet是不是一个好方法:

代码语言:javascript
复制
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路径添加权限?

代码语言:javascript
复制
POST /api/v1/permission_sets/7/permissions

//  Payload
{
    "permission": 24
}

-> 201 CREATED

当我们需要删除该权限时

代码语言:javascript
复制
DELETE /api/v1/permission_sets/7/permissions/24

-> 203 ACCEPTED

我还想补充说,从客户端的角度来看,请求是幂等的和确定性的。权限数量至少为100个。因此,批处理操作将在第二种方法中执行。

EN

回答 2

Stack Overflow用户

发布于 2016-09-24 05:07:43

我认为您目前的解决方案还不错。如果您希望将权限与权限集连接起来,那么您可以使用多个If来描述集合,而不是使用相同的有效负载,例如

代码语言:javascript
复制
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设计,这在大多数时候是不方便的。

代码语言:javascript
复制
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约束,因为REST operates with hyperlinks和机器客户端。因此,从客户端的角度来看,URI具有什么结构并不重要,只要它可以用URI模板来描述即可。您必须记住的唯一一件事是,URI和资源之间存在n:1的关系,因此多个URI可以标识相同的资源,但单个URI不能标识多个资源。

票数 1
EN

Stack Overflow用户

发布于 2016-09-19 13:15:26

如果你打算允许一次更新这么多的权限,那么PATCH可能是你的朋友:

查看RFC 6902 (它定义了补丁标准),从客户端的角度来看,可以这样调用

代码语言:javascript
复制
PATCH /api/v1/permission_sets/7
[
    { "op": "add", "path": "/permission_ids", "value": [ "24", "27", "35" ]}
]

然而,不幸的是,PATCH不是一个idempotent方法( POST也不是,因为几乎相同的显而易见的原因),所以排除后只剩下PUT,这很好,只是比PATCH (客户机必须PUT整个对象,包括permission_ids的整个集合)稍微冗长一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39558784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档