我试图找到最佳实践,以便在Restful中创建一个多到多的关系。这个用法很简单,但我真的找不到正确的方法。
在我们的模型中,我们有Kid,它与守护者的多到多关系相关。在关系表中,我们有两个额外的参数,类型(父母、保姆、紧急情况等)。和活动(布尔)。
您只能将守护者添加到现有的Kid中,但现有的守护者可以链接到另一个Kid。
今天,我们就这样做
POST kids/{kidID}/guardians
{
"type": "parent"
"active": false
"guardian": {
"first_name": "foo"
"last_name": "bar"
}
}这将创建守护者并将其添加到Kid中。但是,使用这种方法,我们无法处理我想要将现有的守护者添加到Kid的情况。在这里,我找到了表示这一点的答案,但我不知道哪一种是最好的(和restful的)方式(也许它们都不是好的.):
解决方案1-保持当前的端点()
但要把一个非强制性的身份字段交给监护人。如果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 kids/{kidID}/guardians/{guardianID}
{
"type": "parent"
"active": false
}附属解决方案:在第二种选择中,我们可以通过以下方式更改资源的URI:
POST kids/{kidID}/kid-guardians/因为它不是真正的“监护人”重新来源,而是一个孩子-监护人重新来源(关系)。我不太喜欢它,因为使用旧的URI,我们可以更容易地假设
GET kids/{kidID}/guardians/会给你所有与孩子有关的监护人,但不是那个
DELETE kids/{kidID}/guardians/{guardianID}将删除关系,而不是卫报。
所以,正如你所理解的,我真的迷路了,非常感谢你的帮助。
诚挚的问候,
发布于 2016-11-02 10:53:37
不可能为关系本身创建第三类资源,如“守护”,而不是从属于其他资源的实例?这似乎是处理数据库中n到n关系的推荐和常用方法。
GET /guards?kid="Johnny"会给你一个关系列表,你可以用它来得到它的所有监护人。GET /guards?guard="Kelly",你可以猜到。/kids和/guards只保存有关资源本身的数据,并且可能比必须将关系数据作为它们的一部分更容易维护。
我认为您可以通过使用指向关系的每个成员的链接来获得更多的RESTful,而不是使用数字ID。而且您可以在孩子和监护人中有一个类似“关系”的字段,与检索他们的特定“警卫”所需的URL+querystring代表,可能有人需要他们。
发布于 2016-11-13 21:20:18
我将使用Fabricio Rocha的答案,实现如下:
POST guardian-kids/
{
"type": "parent",
"guardian": {
"id": "{guardianId}"
},
"kid":{
"id": "{kidId}"
}
}如果你想找回守护神
GET guardian-kids/{GuardianKidId}
{
"type": "parent",
"guardian": {
"id": "{guardianId}",
"url": "guardians/{guardianId}/"
},
"kid": {
"id": "{kidId}",
"url": "kids/{kidId}/"
},
"url": "guardian-kids/{GuardianKidId}/"
}我也提出了这两个终点(你只能得到那些)
GET kids/{kidId}/guardian-kids
{
"type": "parent",
"guardian": {
"id": "{guardianId}",
"url": "guardians/{guardianId}/"
},
"kid": {
"id": "{kidId}",
"url": "kids/{kidId}/"
},
"url": "guardian-kids/{GuardianKidId}/"
}
GET guardians/{guardianId}/guardian-kids
{
"type": "parent",
"guardian": {
"id": "{guardianId}",
"url": "guardians/{guardianId}/"
},
"kid": {
"id": "{kidId}",
"url": "kids/{kidId}/"
},
"url": "guardian-kids/{GuardianKidId}/"
}我在其他方法中看到的“问题”是/kidID/{kidID}/卫士/和/守护者/将不代表相同类型的资源,而是具有相同的名称。
https://stackoverflow.com/questions/40349909
复制相似问题