单个休息“放置”端点是不是足以更新带有嵌套数组的文档?

Posted

技术标签:

【中文标题】单个休息“放置”端点是不是足以更新带有嵌套数组的文档?【英文标题】:Is single rest 'put' endpoint enough to update a document with nested arrays?单个休息“放置”端点是否足以更新带有嵌套数组的文档? 【发布时间】:2016-10-05 07:33:42 【问题描述】:

[我正在复制去年仍然没有回答的确切问题,并将其扩展一点]

我正在使用 node.js + mongoose (MEAN.io) 开发一个 REST api。我有一个模型,其中几乎没有嵌套数组。我有一个 put 端点来更新文档。但是要将对象添加到子数组中,我需要一个单独的端点还是有办法使用相同的放置端点?

companyName: String,
city: String,
pincode: Number,
managers: [
    name: String,
    dob: Date,
    gender: String,         
    highestEducation: String,
    email: String,
    phoneNumbers: [phoneNumber: Number],
],

我有一个端点 ../api/customer 用于更新文档。它用我提供的 json 替换现有文档。那么,如果我想添加一个管理器(而不是替换现有的管理器),我是否需要一个单独的端点呢?优化方案是什么?

目前,我已经创建了另一个这样的 put api:

../api/customer/:id/managers 

在 api 的服务器端,我使用 customer.managers.push(updates); 而不是 _.merge(customer, updates)。 p>

【问题讨论】:

您对数据的处理方式取决于您的数据库模型结构以及您期望 UI 的工作方式。如果没有更多细节,任何人都很难提供帮助。例如,我们不知道您是否有单独的经理模型......如果您这样做,UI 是否应该在它作为客户的一部分显示之前通过它自己的端点保存到数据库 假设客户是唯一的模型。在 UI 方面,假设每当我向客户展示时,我还需要展示所有经理及其电话号码。所以我只有一个模型。 (顺便说一句,否则我当然会为这个问题提供更多细节,但是像这样,你不应该需要更多信息) 因此,基于此,经理将始终在客户文档中,因此听起来甚至不必解析发送到客户端点的内容...只需存储它 我认为您没有明白这一点。假设我想为现有客户的现有经理添加另一个电话号码。那怎么办? 【参考方案1】:

您的 API 设计最终由您选择。就我个人而言,我更喜欢把事情保持得很浅,如果那样的话,也许是一段关系很深。通常,每个资源我都会有一个端点。

就您的示例而言,现有客户的现有经理的新电话号码。使用有点浅的 api 的一般流程可能是:

前端: 转到 URL site/users/1(这会为用户加载基本视图)。 API: 操作:获取 网址:site/api/v1/users/1 描述:显示用户 1 回复: id: 1, name: "bob", age: 22 API: 操作:获取 网址:site/api/v1/managers?query=user_id=1 描述:索引用户 1 的所有管理器 回复: [ id: 55, name: "mana1", phone: 4444 , id: 66, name: "mana2", phone: 333 , .. ] 前端:将管理器列表作为一组带有一些隐藏 ID 的表单 前端:输入电话号码点击保存 API: 行动:补丁 网址:site/api/v1/managers/55 正文: phone: 9898 描述:带有新电话数据的 PATCH 管理器 55 响应: ..更新数据..

我个人非常喜欢这样的 API: https://github.com/WhiteHouse/api-standards

它不是休息,而是简单、可重复和可用。

【讨论】:

因此,如果您有 10 种不同的文档类型,它们以某种方式相互连接,尽管您总是需要从数据库中一起读取它们(在我的情况下:前端:假设每当我向客户展示时,我还需要显示所有经理及其电话号码),您仍然会为每个人进行不同的 api 调用.. 所以 10 GET api 调用。对不起。我不同意你的看法。 不,你不会?只需使用 /site/api/v1/managers?query=user_id=1 这将返回 X 经理与一个电话?它是第二个 API 点

以上是关于单个休息“放置”端点是不是足以更新带有嵌套数组的文档?的主要内容,如果未能解决你的问题,请参考以下文章

创建、更新和获取休息端点中的相同/不同 DTO 对象?

使用 HTTPS 的端点是不是不足以避免嗅探攻击?

Django 休息框架。更新嵌套对象

Django Rest Framework,如何更新序列化程序中的嵌套值

Apache Camel - Spring 休息端点参考

带有连接的 SQL 查询以获取嵌套的对象数组