将嵌套对象POST到REST服务器的最佳实践

时间:2018-02-14 03:10:39

标签: json rest post

我想知道在开发用于创建或更新嵌套数据的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调用?

1 个答案:

答案 0 :(得分:0)

  

那么REST服务器应该如何处理这些信息呢?

它应该将消息传递给知道如何创建客户端的组件,或者更一般地说,它应该

  

根据资源自身的特定语义处理请求中包含的表示。

请参阅RFC 7231

  

它应该是否应该只在顶级对象上执行REST创建/更新操作

不,不要让它变得困难。 REST不关心数据存储中的对象或实体。我们只是操纵资源;在这种情况下,我们只是提交了一个请求,请说明请创建一个客户"。因此,创建一个与消息中的描述匹配的客户端;并报告该结果。或者,如果请求中存在错误,则发回一条消息说明错误。

依次创建此资源需要在数据库中创建实体,或者在数据库中创建此实体与其他实体之间的关系,这一事实是REST无关的实现细节。

记住,目标是让您的服务器就像一个充满文档的网站。