说我有以下两个根资源:
.../organizations
.../persons
GET
上的.../organizations/id
会返回有关特定组织的所有信息,例如姓名,位置等。
GET
上的.../persons/id
会返回有关特定人的所有信息,例如姓名,年龄,性别等。
对组织中人员的成员资格进行建模(用于检索和创建)的首选REST方法是什么?我不仅要为会员本身建模,还要添加额外的属性,例如加入组织的人员日期,他/她在组织中的角色,......
一些想法:
如果我们提供.../organizations/id/persons/id
,GET
应该返回什么?只有会员资料(加入数据,角色......)和.../persons/id
的链接? REST API用户可以使用该链接获取有关此人的所有信息。
我们是否可以POST
.../persons
创建一个人,另一个/ POST
与.../organizations/id/persons
分开创建会员资格?
更进一步,假设一个人必须始终是至少一个组织的成员。在这种情况下,我们需要一个POST
来同时以原子方式创建人员和成员资格。
我们如何建模?我希望保留根资源.../organizations
和.../projects
。在.../organizations/id/persons
上创建人员没有意义,在.../persons/
上创建成员资格也没有意义。
答案 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)
将资源视为可以独立存在而不依赖于另一个对象的对象。这只是一个指南,您可以根据projects
和organizations
了解其工作原理。
我认为membership
的方式应该是它的独立资源,因为它可能在资源person
被删除后存在,例如用于历史目的。
在该模型中,我会创建一个资源/memberships
,因为它不是person
或organization
的属性,会提示您将其添加为person
或organization
子资源。
我不确定我是否同意@hellraiser,即使按照Roy的标准也很难完美。我通常会尝试实现更高级别的REST,如Fowler所述:http://martinfowler.com/articles/richardsonMaturityModel.html
答案 2 :(得分:-1)
实际上,无法实现完美的RESTful API设计。我从未见过满足Roy Fielding制定的所有REST API论文的系统。但是,您可以通过遵循最佳实践来提高从项目到项目的rest api设计技能。 这是第一次看article。