使用集合更新实体
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; }
}
这个端点:
部分团队更新(没有球员):[PATCH] /api/teams/{teamId}
。为我提供选项来更新球队的特定领域,但没有球员。
更新球队(有球员):[PUT] /api/teams/{teamId}
。在有效负载数据中,我将 json
与整个 Team
对象一起传递,包括玩家集合。
单独更新播放器:[PUT] /api/teams/{teamId}/players/{playerId}
我开始怀疑我是否需要端点 #2。端点 #2 的唯一优势是我可以在一个请求中更新多个播放器。我也可以一次删除或添加多个玩家。所以我开始寻找任何标准,在现实世界中如何处理这种流行的场景?
我有两个选择:
- 保持端点 #2 能够同时 update/add/remove 多个子记录。
- 删除端点#2。仅允许通过
PATCH
更改团队,而无法操纵 Player
集合。 Player
集合只能由端点更改:
[POST] /api/teams/{teamId}/players
[PUT] /api/teams/{teamId}/players/{playerId}
[DELETE] /api/teams/{teamId}/players/{playerId}
哪个选项是更好的做法?是否有标准如何处理带有集合情况的实体?
谢谢。
本质上说 POST 是真正的追加动词。如果您没有真正更新整个播放器资源,那么您只是将另一个播放器附加到列表中。
我同意的主要论点是,PUT 动词需要您正在更新的内容的完整表示。
另一方面,我会用补丁来同时更新一堆资源。
没有真正错误或正确的方法。这取决于您在一天结束时如何看待域。
您可以进行批量操作,我当然会使用 POST。不过,有些事情需要考虑。
- 如何处理部分成功。一个人会辜负其他人吗?如果没有,您的回应是什么?
- 你将如何发回新资源url?新资源应该很容易被发现。
除了一些设计考虑外,如果您要进行多次插入,最好批量进行。如果一次是一对夫妇,请保存你自己和将要消费它的人,一个一个地去。
我在寻找标准时遇到问题,这样的更新会是什么样子。我有这个模型(简化)。请记住,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; }
}
这个端点:
部分团队更新(没有球员):
[PATCH] /api/teams/{teamId}
。为我提供选项来更新球队的特定领域,但没有球员。更新球队(有球员):
[PUT] /api/teams/{teamId}
。在有效负载数据中,我将json
与整个Team
对象一起传递,包括玩家集合。单独更新播放器:
[PUT] /api/teams/{teamId}/players/{playerId}
我开始怀疑我是否需要端点 #2。端点 #2 的唯一优势是我可以在一个请求中更新多个播放器。我也可以一次删除或添加多个玩家。所以我开始寻找任何标准,在现实世界中如何处理这种流行的场景?
我有两个选择:
- 保持端点 #2 能够同时 update/add/remove 多个子记录。
- 删除端点#2。仅允许通过
PATCH
更改团队,而无法操纵Player
集合。Player
集合只能由端点更改:[POST] /api/teams/{teamId}/players
[PUT] /api/teams/{teamId}/players/{playerId}
[DELETE] /api/teams/{teamId}/players/{playerId}
哪个选项是更好的做法?是否有标准如何处理带有集合情况的实体?
谢谢。
本质上说 POST 是真正的追加动词。如果您没有真正更新整个播放器资源,那么您只是将另一个播放器附加到列表中。
我同意的主要论点是,PUT 动词需要您正在更新的内容的完整表示。
另一方面,我会用补丁来同时更新一堆资源。
没有真正错误或正确的方法。这取决于您在一天结束时如何看待域。
您可以进行批量操作,我当然会使用 POST。不过,有些事情需要考虑。
- 如何处理部分成功。一个人会辜负其他人吗?如果没有,您的回应是什么?
- 你将如何发回新资源url?新资源应该很容易被发现。
除了一些设计考虑外,如果您要进行多次插入,最好批量进行。如果一次是一对夫妇,请保存你自己和将要消费它的人,一个一个地去。