【问题标题】:Best practise for managing m:n relations in an RESTful API在 RESTful API 中管理 m:n 关系的最佳实践
【发布时间】:2019-08-30 02:05:31
【问题描述】:

我正在设计一个 API,我想注意 RESTful 方法。 因为在我的研究中,大多数类似的文章都提到了球员和球队,我会坚持下去。 在这种情况下,一名球员一次可以拥有多个球队,但必须至少拥有一个球队。 如果玩家隶属于多个团队,则无法删除该玩家。

为此,如果您想创建一个播放器,您需要:

POST /teams/{id}/players

直接 POST /players 不会考虑到玩家有团队所以不允许。

如果你想删除一个播放器,你可以这样做:

DELETE /players/{id}

只有当玩家只隶属于一支球队时才应该这样做,但如果球员在多支球队中,则应该被拒绝(在这种情况下,您需要解除除一支球队之外的所有球队的链接)。

现在我有不同的方法来处理在团队和玩家之间创建和删除新链接:

  1. POST /teams/{id}/players/{id}
  2. PUT /teams/{id}/players/{id}
  3. POST /players-teams(正文中包含 player_id 和 teams_id)

一个。 DELETE /teams/{id}/players/{id}

b. DELETE /players-teams/{id}

对不同解决方案的一些想法:

ad 1. GET 不会引用相同的信息

ad 2. 我没有提供关系的 id...

ad 3. 我应该提供GET /teams/{id}/players-teamsGET /players/{id}/players-teams - 还是GET /players/{id}/teams-players

广告那不会删除播放器吗?

广告 b.谁会知道关系的ID?

【问题讨论】:

    标签: rest api many-to-many


    【解决方案1】:

    鉴于一个玩家可以存在于多个团队中,并且团队与玩家之间的关系可能会发生变化,我认为为此设置 2 个单独的命名空间是很常见的:

    players/ <- list of all players
    players/{id} <- a single player
    teams/ <- list of all teams
    teams/{id} <- a single team
    

    这里缺少的是球队和球员之间的关系。处理此问题的一个好方法可能是将玩家表示为团队的链接。这种团队资源的虚构表示:

    {
       name: "team awesome",
       _links: {
         self : { href: "/teams/A" },
         players: [
           { href: "/players/1" },
           { href: "/players/2" },
         ]
      }
    }
    

    如果关系表示为团队资源上的链接,则将球员移除或添加到团队的行为与向团队发送 PUT 资源并添加/移除这些链接相同。上述格式使用 HAL。

    但是,如果您只想获得完整的玩家名单和他们的信息怎么办?绝对可以将“团队中的所有玩家”表示为单独的资源,也许在:

    /teams/{id}/players
    

    我仍然会确保此资源中的所有玩家都链接到 /players/{id} 而不是 /team/{id}/players/{id}

    尽管不允许单个实体出现在系统中的多个 url 上,但这可能会让用户感到困惑,因为它们看起来像是单独的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-06
      • 2020-05-22
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      相关资源
      最近更新 更多