我试图找到最佳实践来创建Restful API中的多对多关系。这个用例非常简单,但是我不能真正找到“正确”的方法。
在我们的模型中,我们有与Guardian存在多对多关系的Kid。在关系表中,我们有两个额外的参数:类型(父母,保姆,紧急情况等)和活动(布尔值)。
您只能将Guardian添加到现有的Kid中,但是现有的Guardian可以链接到另一个Kid。
今天,我们就是这样做的
POST kids/{kidID}/guardians
{
"type": "parent"
"active": false
"guardian": {
"first_name": "foo"
"last_name": "bar"
}
}
这将创建一个Guardian并将其添加到孩子中。但是,使用这种方法,我们无法处理我想要将现有的Guardian添加到Kid的情况。以下是我找到的解决方案,但我不知道哪个是最好的(也许没有一个好...):
解决方案1 - 保持今天的端点
但是在guardian中放置一个非强制性的id字段。如果id为空,则API必须创建资源;否则,只需检索它并在需要时更新其值。
POST kids/{kidID}/guardians/
{
"type": "parent"
"active": false
"guardian": {
"id": "ab65f263-dd3d-bbc6-8b7b-57a3b4b26c21"
}
}
解决方案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操作。
PUT kids/{kidID}/guardians/{guardianID}
{
"type": "parent"
"active": false
}
子方案:在第二个选择中,我们可以通过更改资源的URI来解决问题:
POST kids/{kidID}/kid-guardians/
因为它实际上没有发布“guardian”资源,而是发布了一个孩子-监护人的资源(关系)。我不太喜欢这个,因为使用旧的URI,我们可以更容易地假设
GET kids/{kidID}/guardians/
我会为你提供与孩子相关的所有Guardians(监护人),但不包括其他方面。
DELETE kids/{kidID}/guardians/{guardianID}
将删除关联,但不删除Guardian(监护人)。
所以,您可以理解我确实很迷茫,希望您的帮助。
最好的问候,
2 - 如果您想获得有关特定关系的数据,并且这些关系可以随时间而来去,则
GET/POST/PUT/DELETE /guards/{id}
是有意义的,似乎更容易维护,甚至可以在客户端应用程序中隐藏,在您的#3想法(下一步)之后。3 - 您可以创建这样的别名,当然也可以使用
/guardians/{id}/kids
。顺便说一下,我不知道"EP"是什么意思:)祝好运! - Fabricio Rocha