我想知道开发用于创建或更新嵌套数据的REST API服务器时的常用方法是什么。
假设我有一组数据库模型,如下所示:
"client" (id, firstname, lastname, ForeignKey to "address")
"address" (id, street, city, state, country)
"email" (id, type, emailaddress, ForeignKey to "client")
"phone" (id, type, number, ForeignKey to "client")
Run Code Online (Sandbox Code Playgroud)
换句话说,一个客户只有一个地址,但是每个客户可以有多个电子邮件,每个客户可以有多个电话号码。现在假设我正在开发一个REST API服务器,该服务器允许用户创建/编辑/删除任何这些对象。“地址”,“电子邮件”和“电话”对象很简单。但是,“客户”呢?当用户想要创建一个新客户端时,该用户将向POST命令发送带有JSON数据结构的服务器,该数据结构如下所示:
{
"id": 123,
"firstname": "John",
"lastname": "Smith",
"address": {"street": "123 Anystreet", "city": "Los Angeles", "state": "California", "country": "USA"},
"emails": [
{"id": 7, "client_id": 123, "type": "home", "emailaddress": "john@home.com"},
{"id": 12, "client_id": 123, "type": "work", "emailaddress": "john.smith@work.com"}
],
"phones": [
{"id": 28, "client_id": 123, "type": "home", "number": "(555) 555-1234"},
{"id": 17, "client_id": 123, "type": "work", "number": "(555) 555-9876"}
]
}
Run Code Online (Sandbox Code Playgroud)
那么REST服务器应该如何处理此信息?显然,它应该保存顶级客户端对象(具有firstname和lastname字段),但是对嵌套对象应该怎么做?是否应该检查数据库中id = 7的电子邮件并更新该电子邮件对象?还是应该检查数据库以仅将id = 7或id = 12的电子邮件设置为指向该客户端?我不清楚嵌套的REST对象创建和更新操作的预期语义是什么。还是(应该)仅在顶级对象上执行REST创建/更新操作,并且如果用户想要创建或修改嵌套/嵌入的对象,则用户应该进行其他REST调用来这样做?
那么 REST 服务器应该如何处理这些信息呢?
它应该将消息传递给知道如何创建客户端的组件,或者更一般地说,它应该
根据资源自身的特定语义处理请求中包含的表示。
参见RFC 7231
REST 创建/更新操作是否/应该只在顶级对象上执行
不,别让事情变得困难。REST 与数据存储中的对象或实体无关。我们只是在操纵资源;在这种情况下,我们只是发送一个请求“请创建一个客户端”。因此创建一个与消息中的描述相匹配的客户端;并报告该结果。或者,如果请求中存在错误,则发回一条消息解释该错误。
事实上,创建此资源又需要在数据库中创建一个实体,或者在该实体与数据库中的其他实体之间创建关系,这是 REST 不感兴趣的实现细节。
请记住,我们的目标是让您的服务器就像一个充满文档的网站一样。
| 归档时间: |
|
| 查看次数: |
941 次 |
| 最近记录: |