【发布时间】:2016-10-31 20:15:25
【问题描述】:
我试图找到最佳实践,以便在 Restful API 中创建多对多关系。用例非常简单,但我找不到真正的“正确”方法。
在我们的模型中,我们有与 Guardian 的多对多关系相关的 Kid。在关系表中,我们有 2 个额外的参数,type(parent、nanny、emergency 等)和 active(布尔值)。
您只能将 Guardian 添加到现有 Kid,但现有 Guardian 可以与另一个 Kid 链接>.
今天,我们就是这样做的
POST kids/{kidID}/guardians
{
"type": "parent"
"active": false
"guardian": {
"first_name": "foo"
"last_name": "bar"
}
}
这将创建 Guardian 并将其添加到 Kid。但是,使用这种方法,我们无法处理我想将现有 Guardian 添加到 Kid 的情况。这是我为了代表这一点而找到的答案,但我不知道哪一个是最好的(和宁静的)方式(也许没有一个是好的......):
解决方案 1 - 保持端点为今天
但是给 guardian 设置一个非强制性的 id 字段。如果 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/
因为它并没有真正发布“监护人”资源,而是儿童监护人资源(关系)。我不太喜欢它,因为使用旧的 URI 我们可以更容易地假设
GET kids/{kidID}/guardians/
会给你所有与孩子有关的监护人,但不是那个
DELETE kids/{kidID}/guardians/{guardianID}
将删除关系而不是 Guardian。
如您所知,我真的很迷茫,希望您的帮助。
最好的问候,
【问题讨论】:
标签: rest entity-relationship restful-architecture restful-url nested-resources