REST - 如何建模与关系数据的关系

时间:2014-10-17 09:33:05

标签: rest relationship restful-architecture

说我有以下两个根资源:

.../organizations
.../persons

GET上的.../organizations/id会返回有关特定组织的所有信息,例如姓名,位置等。

GET上的.../persons/id会返回有关特定人的所有信息,例如姓名,年龄,性别等。

对组织中人员的成员资格进行建模(用于检索和创建)的首选REST方法是什么?我不仅要为会员本身建模,还要添加额外的属性,例如加入组织的人员日期,他/她在组织中的角色,......

一些想法:

  • 如果我们提供.../organizations/id/persons/idGET应该返回什么?只有会员资料(加入数据,角色......)和.../persons/id的链接? REST API用户可以使用该链接获取有关此人的所有信息。

  • 我们是否可以POST .../persons创建一个人,另一个/ POST.../organizations/id/persons分开创建会员资格?

  • 更进一步,假设一个人必须始终是至少一个组织的成员。在这种情况下,我们需要一个POST来同时以原子方式创建人员和成员资格。

    我们如何建模?我希望保留根资源.../organizations.../projects。在.../organizations/id/persons上创建人员没有意义,在.../persons/上创建成员资格也没有意义。

3 个答案:

答案 0 :(得分:3)

不会使用HAL并且其简单格式满足您的需求吗?

假设我们为个人,组织和会员确定了资源 我们正在尝试检索与" 42"。

标识的人相关的信息

请求:

GET /persons/42 HTTP/1.1
Accept: application/hal+json

响应:

HTTP1.1 200 OK
Content-Type: application/hal+json
{
    "id": 42,
    "name": "Smith",
    "firstName": "John",

    "organization": {
        "id": 1234,
        "name": "blah",
        "href": "http://myserver/organizations/1234"
    },

    "membership": {
        "id": 5678,
        "name": "blih",
        "href": "http://myserver/memberships/5678"
    },

    "_links": {
        "self" : {
            "href" : "http://myserver/persons/42"
        }
    }
}

人员资源是指通过"组织的父组织。 关系。该关系使您可以轻松导航到相应的组织 资源通过相应的href链接。

以相同的方式,会员关系允许访问相应的 会员资料(再次通过" href"链接),如果您考虑会员资格 将一个人与一个组织联系起来。

请求:

GET /memberships/5678 HTTP/1.1
Accept: application/hal+json

响应:

HTTP1.1 200 OK
Content-Type: application/hal+json
{
    "id": 5678,
    "name": "blih",

    "person": {
        "id": 42,
        "href": "http://myserver/persons/42"
    },

    "organization": {
        "id": 1234,
        "href": "http://myserver/organizations/1234"
    },

    "_links": {
        "self": {
            "href": "http://myserver/memberships/5678"
        }
    }
}

请注意,我并不是说上面的模型是适合您的模型 需求(例如,一个人可能属于多个组织,然后您需要序列化中的数组)。

我的观点是,使用HAL可能会帮助您模拟化您想要的内容。

答案 1 :(得分:0)

将资源视为可以独立存在而不依赖于另一个对象的对象。这只是一个指南,您可以根据projectsorganizations了解其工作原理。

我认为membership的方式应该是它的独立资源,因为它可能在资源person被删除后存在,例如用于历史目的。

在该模型中,我会创建一个资源/memberships,因为它不是personorganization的属性,会提示您将其添加为personorganization子资源。

我不确定我是否同意@hellraiser,即使按照Roy的标准也很难完美。我通常会尝试实现更高级别的REST,如Fowler所述:http://martinfowler.com/articles/richardsonMaturityModel.html

答案 2 :(得分:-1)

实际上,无法实现完美的RESTful API设计。我从未见过满足Roy Fielding制定的所有REST API论文的系统。但是,您可以通过遵循最佳实践来提高从项目到项目的rest api设计技能。 这是第一次看article

相关问题