gpt4 book ai didi

rest - 在 Restful API 中创建多对多关系的 "right"方法是什么

转载 作者:行者123 更新时间:2023-12-01 13:40:55 25 4
gpt4 key购买 nike

我试图找到最佳实践,以便在 Restful API 中创建多对多关系。用例非常简单,但我无法真正找到“正确”的方法。

在我们的模型中,我们有 Kid,它与 Guardian 存在多对多关系。在关系表中,我们有 2 个额外参数,type( parent 、保姆、紧急情况等)和 active( bool 值)。

您只能将 Guardian 添加到现有的 Kid,但现有的 Guardian 可以链接到另一个 Kid>.

今天,我们就是这样做的

POST kids/{kidID}/guardians
{
"type": "parent"
"active": false
"guardian": {
"first_name": "foo"
"last_name": "bar"
}
}

这将创建 Guardian 并将其添加到 Kid。但是,使用这种方法我们无法处理我想将现有的 Guardian 添加到 Kid 的情况。这里是我找到的答案,以表示这一点,但我不知道哪个是最好的(和 Restful )方式(也许它们都不是好的......):

解决方案 1 - 保持今天的端点

但是把一个非强制性的 id 字段给 guardian。如果 id 为空,API 必须创建资源,否则只需检索它并在需要时更新值。

POST kids/{kidID}/guardians/
{
"type": "parent"
"active": false
"guardian": {
"id": "ab65f263-dd3d-bbc6-8b7b-57a3b4b26c21"
}
}

解决方案 2 - 在 2 个调用中中断此端点

# Create the Guardian
POST guardians/
{
"first_name": "foo"
"last_name": "bar"
}

# This method can only "link" the models
POST kids/{kidID}/guardians/
{
"type": "parent"
"active": false
"guardian_id": "ab65f263-dd3d-bbc6-8b7b-57a3b4b26c21"
}

[已编辑] 解决方案 2.5 - 创建与 PUT 的关系

和以前一样,您必须创建监护人,但是为了添加您创建的关系

PUT kids/{kidID}/guardians/{guardianID}
{
"type": "parent"
"active": false
}

辅助解决方案:在第二个选择中,我们可以通过以下方式更改资源的URI:

POST kids/{kidID}/kid-guardians/

因为它并没有真正发布一个“监护人”资源,而是一个 child 监护人资源(关系)。我不太喜欢它,因为使用旧的 URI 我们可以更容易地假设

GET kids/{kidID}/guardians/

会给你所有与 child 有关的守护者,但不是那个

DELETE kids/{kidID}/guardians/{guardianID}

将删除关系而不是 Guardian

如您所知,我真的迷路了,非常感谢您的帮助。

最好的问候,

最佳答案

是否可以为关系本身创建第三类资源,例如“守卫”,而不是从属于其他资源的实例?这似乎是处理数据库中 n 对 n 关系的推荐和常用方法。

GET/guards?kid="Johnny" 会给你一个关系列表,你可以用它来获取所有监护人。 GET/guards?guard="Kelly",你可以猜到。 /kids/guards 将仅保留有关资源本身的数据,并且可能比必须将关系数据保留为资源的一部分更容易维护。

我认为您可以通过使用关系中每个成员的链接而不是数字 ID 来获得更多 RESTful。你可以在 child 和监护人的表示中有一个像“关系”这样的字段,其中包含检索他们特定“监护人”所需的 URL + 查询字符串,如果有人需要的话。

关于rest - 在 Restful API 中创建多对多关系的 "right"方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com