首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Restful中创建多到多关系的“正确”方法是什么?

在Restful中创建多到多关系的“正确”方法是什么?
EN

Stack Overflow用户
提问于 2016-10-31 20:15:25
回答 2查看 4.2K关注 0票数 3

我试图找到最佳实践,以便在Restful中创建一个多到多的关系。这个用法很简单,但我真的找不到正确的方法。

在我们的模型中,我们有Kid,它与守护者的多到多关系相关。在关系表中,我们有两个额外的参数,类型(父母、保姆、紧急情况等)。和活动(布尔)。

您只能将守护者添加到现有的Kid中,但现有的守护者可以链接到另一个Kid

今天,我们就这样做

代码语言:javascript
复制
POST kids/{kidID}/guardians
{
    "type": "parent"
    "active": false 
    "guardian": {
        "first_name": "foo"
        "last_name": "bar"
    }
}

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

解决方案1-保持当前的端点()

但要把一个非强制性的身份字段交给监护人。如果id为空,则API必须创建重新源,否则只需检索它并在需要时更新值。

代码语言:javascript
复制
POST kids/{kidID}/guardians/
{
    "type": "parent"
    "active": false 
    "guardian": {
        "id": "ab65f263-dd3d-bbc6-8b7b-57a3b4b26c21"
    }
}

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

代码语言:javascript
复制
# 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创建关系

和以前一样,您必须创建守护者,但是为了添加关系,您必须创建一个

代码语言:javascript
复制
PUT kids/{kidID}/guardians/{guardianID}
{
    "type": "parent"
    "active": false 
}

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

代码语言:javascript
复制
POST kids/{kidID}/kid-guardians/

因为它不是真正的“监护人”重新来源,而是一个孩子-监护人重新来源(关系)。我不太喜欢它,因为使用旧的URI,我们可以更容易地假设

代码语言:javascript
复制
GET kids/{kidID}/guardians/

会给你所有与孩子有关的监护人,但不是那个

代码语言:javascript
复制
DELETE kids/{kidID}/guardians/{guardianID}

将删除关系,而不是卫报

所以,正如你所理解的,我真的迷路了,非常感谢你的帮助。

诚挚的问候,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 10:53:37

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

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

我认为您可以通过使用指向关系的每个成员的链接来获得更多的RESTful,而不是使用数字ID。而且您可以在孩子和监护人中有一个类似“关系”的字段,与检索他们的特定“警卫”所需的URL+querystring代表,可能有人需要他们。

票数 2
EN

Stack Overflow用户

发布于 2016-11-13 21:20:18

我将使用Fabricio Rocha的答案,实现如下:

代码语言:javascript
复制
POST guardian-kids/
{
    "type": "parent",
    "guardian": {
        "id": "{guardianId}"
    },
    "kid":{
        "id": "{kidId}"
    }
}

如果你想找回守护神

代码语言:javascript
复制
GET guardian-kids/{GuardianKidId}
{
    "type": "parent",
    "guardian": {
        "id": "{guardianId}",
        "url": "guardians/{guardianId}/"
    },
    "kid": {
        "id": "{kidId}",
        "url": "kids/{kidId}/"
    },
    "url": "guardian-kids/{GuardianKidId}/"
}

我也提出了这两个终点(你只能得到那些)

代码语言:javascript
复制
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}/卫士/和/守护者/将不代表相同类型的资源,而是具有相同的名称。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40349909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档