【问题标题】:Update an Entity with the Collection使用集合更新实体
【发布时间】:2019-12-13 14:41:26
【问题描述】:

我很难找到一个标准,这样的更新会是什么样子。我有这个模型(简化)。请记住,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 以便能够同时更新/添加/删除许多子记录。
  2. 删除端点 #2。仅允许通过 PATCH 更改团队,而无法操作 Player 集合。 Player 集合只能由端点更改:
    • [POST] /api/teams/{teamId}/players
    • [PUT] /api/teams/{teamId}/players/{playerId}
    • [DELETE] /api/teams/{teamId}/players/{playerId}

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

谢谢。

【问题讨论】:

    标签: c# rest asp.net-web-api url-routing asp.net-core-webapi


    【解决方案1】:

    这里的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?新资源应该很容易被发现。

    除了一些设计考虑之外,如果您要进行多次插入,最好批量进行。如果一次是一对,请保存自己和会消耗它一段时间的人,并一个接一个。

    【讨论】:

    • 在您引用的问题中,他询问如何“将现有实体添加到集合中” .. 所以,澄清一下:当我致电 [POST] /api/teams/{teamId}/players 时,我创建了 NEW球员,不是现有球员(您必须提供他的姓名、年龄等。全新球员)。将其视为“订单/项目”情况。
    • 那么,我是否理解正确,您会选择选项 2(因此摆脱端点 2),并允许仅通过添加/更新/删除一个玩家来更改收藏?
    • 我更新了答案以解释原因。真的没有对错之分。
    • 我想,但我会澄清我的问题,也许会问一个新问题。这个问题的措辞并不理想
    • 我也回复了那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2011-06-04
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多