使用集合更新实体

问题描述 投票:1回答:1

我在寻找标准时遇到了问题,这种更新看起来如何。我有这个模型(简体)。请记住,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个回答
0
投票

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?新资源应该易于发现。

除了一些设计方面的考虑,如果您要使用多个插入件,则最好批量进行。如果一次是一对夫妇,请救自己和将要花费一些时间的人们,并一一对应。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.