【问题标题】:How to manage relationship between 3 resources in REST API如何在 REST API 中管理 3 个资源之间的关系
【发布时间】:2014-04-25 07:23:23
【问题描述】:

我正在创建一个基于 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]
        }]
    }]
}

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

【问题讨论】:

    标签: api rest relationship api-design


    【解决方案1】:

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

    我认为典型的 RESTful 答案是从名词、AKA 资源的角度来思考。即使您将这种三向连接视为名词之间的关系,连接本身也是名词。 这就是您希望 REST API 公开的内容。

    由于没有更好的术语,您的连接名称可能是assignment(或allocation,或其他)。例如。 “爱丽丝在 Google 从事营销工作”是一项任务。

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

    例如一个赋值对象:

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

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

    类似地,获取 /groups/google/assignments 会返回一个包含在 Google 工作的人员的所有分配对象的列表。

    这样做的好处是,现在您的作业是真正一流的。您现在可以执行诸如跟踪 old 分配之类的操作,同时让您的主要 API 仅返回 当前 个。等等(向this answer 提供灵感。)

    希望这会有所帮助!

    【讨论】:

    • 是的,但在这里我看不到组/人/角色之间的联系。我的意思是,我们应该能够从电话中检索到的事情是: - 给我谷歌和 Facebook 的所有营销和销售人员 - 给我某个用户的所有角色 - 给我所有的人 现在我做到了真的很简单。只是一个看起来像这样的简单资源 { "id": "...", "user": "alice", "group": "google", "role": "Marketing" }
    • 我认为这是对简单问题域的一次很好的探索,也是对包含层次结构的有用资源模型的提议,尽管 OP 显然不理解您的建议。
    猜你喜欢
    • 2019-07-25
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多