我想知道在开发用于创建或更新嵌套数据的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")
换句话说,客户端只有一个地址,但每个客户端可能有多封电子邮件,每个客户端可能有多个电话号码。现在假设我正在开发一个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"}
]
}
那么REST服务器应该如何处理这些信息呢?显然它应该保存顶级客户端对象(带有firstname和lastname字段),但它应该如何处理嵌套对象?它应该检查数据库中是否有id = 7的电子邮件并更新该电子邮件对象?或者它应该检查数据库以仅设置id = 7或id = 12的电子邮件指向此客户端?我不清楚嵌套REST对象创建和更新操作的预期语义是什么。或者是否应该是这样的情况:REST创建/更新操作应该只在顶级对象上执行,如果用户想要创建或修改嵌套/嵌入对象,那么用户应该进行额外的REST调用?
答案 0 :(得分:0)
那么REST服务器应该如何处理这些信息呢?
它应该将消息传递给知道如何创建客户端的组件,或者更一般地说,它应该
根据资源自身的特定语义处理请求中包含的表示。
请参阅RFC 7231
它应该是否应该只在顶级对象上执行REST创建/更新操作
不,不要让它变得困难。 REST不关心数据存储中的对象或实体。我们只是操纵资源;在这种情况下,我们只是提交了一个请求,请说明请创建一个客户"。因此,创建一个与消息中的描述匹配的客户端;并报告该结果。或者,如果请求中存在错误,则发回一条消息说明错误。
依次创建此资源需要在数据库中创建实体,或者在数据库中创建此实体与其他实体之间的关系,这一事实是REST无关的实现细节。
记住,目标是让您的服务器就像一个充满文档的网站。