【问题标题】:How should I design my RESTful API in this concrete case?在这种具体情况下,我应该如何设计我的 RESTful API?
【发布时间】:2015-04-07 16:31:48
【问题描述】:

我正在使用 Loopback.io 构建一个 API,我一直在思考应该如何设计一些端点。 了解上下文:

a Person hasMany Groups,
a Group hasMany People (and one of them is the admin),
a Member is the "Through" model for Person and Group,
a Group hasMany Sessions.

现在我有 (A)

  1. /人
  2. /People/{id}/Groups
  3. /组
  4. /Groups/{id}/Sessions

这是 Loopback 生成的 API。 2 和 3 是“重复”端点,但是 2 创建了一个成员实例,而 3 没有。

选项 B

  1. /人
  2. /People/{id}/Groups
  3. /People/{id}/Groups/{groupId}/Sessions

选项 C

  1. /人
  2. /群组
  3. /Groups/{id}/Sessions

我想知道哪种方法最好,以及 A 解决方案是否足够好。 非常感谢。

【问题讨论】:

    标签: api rest loopbackjs endpoints


    【解决方案1】:

    选择最接近选项 C 的东西:

    /people
    /people/{person_id}
    /groups
    /groups/{group_id}
    /sessions
    /sessions/{session_id}
    

    你的资源看起来像这样:

    GET /people/1
    {
      "person_id": 1,
      "groups": [
        "/groups/5",
        "/groups/7"
      ]
    }
    
    GET /groups/5          (Option 1 - if every group has exactly one admin)
    {
      "group_id": 5,
      "admin": "/people/1",
      "members": [
        "/people/1",
        "/people/4",
        "/people/5"
      ],
      "sessions": [
        "/sessions/2",
        "/sessions/3"
      ]
    }
    
    GET /groups/5          (Option 2 - if groups can have any number of admins)
    {
      "group_id": 5,
      "members": [
        {
          "person": "/people/1",
          "is_admin": true,
        },
        {
          "person": "/people/4",
          "is_admin": false
        },
        {
          "person": "/people/5",
          "is_admin": false
        }
      ],
      "sessions": [
        "/sessions/2",
        "/sessions/3"
      ]
    }
    
    GET /sessions/3
    {
      "session_id": 3,
      "group": "/groups/5"
    }
    

    我的建议始终是避免嵌套 URI,除非有很好的理由这样做。

    【讨论】:

    • 我喜欢你的方法。但是,有什么具体的原因吗?我认为在可能的情况下,嵌套 URI 是设计 API 的最优雅的方式。
    • @EnricAyguadé 每个资源都应该有一个唯一的 URI。像 /gizmos/{gizmo_id}/widgets/{widget_id} 这样的 URI 意味着每个小部件都有 1 个相关的 gizmo,并且如果不标识其相关 gizmo,则无法识别小部件。如果将来你想改变它怎么办?现在所有小部件的 URI 都需要更改!相反,如果您采用我建议的路线,则只有 resources 会发生变化,而 URIs 不会发生变化。可能出现这种情况的一个具体示例是您的声明“一个组有很多人(其中一个是管理员)”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2012-12-16
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多