如何管理REST API中3个资源之间的关系

时间:2014-03-19 07:39:48

标签: api rest relationship api-design

我正在创建一个基于REST概念的API,但我仍然有点混淆谈论相关资源。

我有一个网站,人们可以在多个群组中注册并选择多个角色。例如,让我们将在公司中注册的人视为场景:

公司

  1. 谷歌
  2. 苹果
  3. 角色

    • 营销
    • 销售
    • 开发
    • 客户支持

    因此,当我想在具有特定角色的新公司中创建用户时,我会将这样的内容传递给对/ users端点的POST请求

    {
           "username" : "raffaele.izzia",
            "email"   : "example@email.com",
            "groups"  : [{
              "id" : 1,
              "roles" : ["Sales","Customer support"]
            },
            {
              "id" : 2,
              "roles" : ["Sales","Marketing"]
            }]
    }
    

    通过这种方法,一旦我从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
        }]
    }
    

    或者这个:

    { 
        groups: [{
            "id" : 2,
            "name"   : "Google",
            "roles"  : [{
               "name"  : "Sales"
               "users" : [2,3,4,10]
            },{
               "name"  : "Marketing"
               "users" : [4,10,8,57]
            }]
        }]
    }
    

    您认为这种关系的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:3)

这是一个很好的问题。绝对是一个棘手的情况。

我认为典型的RESTful答案是用名词,AKA资源来思考。即使您将此3向连接视为名词之间的关系,连接本身也是名词。 那是您希望REST API公开的内容。

如果缺少更好的术语,您的关联名称可能是作业(或分配,或其他)。例如。 " Alice在Google营销中工作#34;是一项任务。

现在开辟了新的可能性,可以满足您的需求。

E.g。作业对象:

{
    "id": "...",
    "user": {...},  // e.g. Alice
    "group": {...}, // e.g. Google
    "role": "Marketing"
}

提取/users/alice/assignments会返回所有作业的列表。

同样,提取/groups/google/assignments会返回在Google工作的人员的所有分配对象的列表。

这样做的好处是,现在你的作业真的是一流的。您现在可以执行诸如跟踪分配之类的操作,同时让主API仅返回当前分配。等等(道具到this answer获取灵感。)

希望这有帮助!