使用集合更新实体

Update an Entity with the Collection

我在寻找标准时遇到问题,这样的更新会是什么样子。我有这个模型(简化)。请记住,Team 允许没有任何玩家,Team 最多可以有 500 名玩家:

public class Team
{
    public int TeamId { get; set; }
    public string Name { get; set; }
    public string City { get; set; }

    public List<Player> Players { get; set; }
}

public class Player
{
    public int PlayerId { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

这个端点:

  1. 部分团队更新(没有球员):[PATCH] /api/teams/{teamId}。为我提供选项来更新球队的特定领域,但没有球员。

  2. 更新球队(有球员):[PUT] /api/teams/{teamId}。在有效负载数据中,我将 json 与整个 Team 对象一起传递,包括玩家集合。

  3. 单独更新播放器:[PUT] /api/teams/{teamId}/players/{playerId}

我开始怀疑我是否需要端点 #2。端点 #2 的唯一优势是我可以在一个请求中更新多个播放器。我也可以一次删除或添加多个玩家。所以我开始寻找任何标准,在现实世界中如何处理这种流行的场景?

我有两个选择:

  1. 保持端点 #2 能够同时 update/add/remove 多个子记录。
  2. 删除端点#2。仅允许通过 PATCH 更改团队,而无法操纵 Player 集合。 Player 集合只能由端点更改:
    • [POST] /api/teams/{teamId}/players
    • [PUT] /api/teams/{teamId}/players/{playerId}
    • [DELETE] /api/teams/{teamId}/players/{playerId}

哪个选项是更好的做法?是否有标准如何处理带有集合情况的实体?

谢谢。

这里 https://softwareengineering.stackexchange.com/questions/232130/what-is-the-best-pattern-for-adding-an-existing-item-to-a-collection-in-rest-api 可以真正帮助您。

本质上说 POST 是真正的追加动词。如果您没有真正更新整个播放器资源,那么您只是将另一个播放器附加到列表中。

我同意的主要论点是,PUT 动词需要您正在更新的内容的完整表示。

另一方面,我会用补丁来同时更新一堆资源。

没有真正错误或正确的方法。这取决于您在一天结束时如何看待域。

您可以进行批量操作,我当然会使用 POST。不过,有些事情需要考虑。

  1. 如何处理部分成功。一个人会辜负其他人吗?如果没有,您的回应是什么?
  2. 你将如何发回新资源url?新资源应该很容易被发现。

除了一些设计考虑外,如果您要进行多次插入,最好批量进行。如果一次是一对夫妇,请保存你自己和将要消费它的人,一个一个地去。