如何使用 REST POST、修补和删除子文档数组中的项目

How to POST, PATCH and DELETE items from a subdocument array using REST

假设我们有以下用户文档:

{
  "_id": "1",
  "firstName": "Joe",
  "hobbies": [
     "_id": "1",
     "name": "music",
     "talented": true
   ],
}

假设我们想要 POST、修补或删除 Joey 的一项爱好。 我们应该如何使用休息 api?

我想过这样做:

POST - /users/:id/hobbies


PATCH - /users/:id/hobbies/:id


DELETE - /users/:id/hobbies/:id

这看起来非常语义化且易于阅读,但另一方面,将子文档名称作为资源附加到路由中感觉不对,因为它是子文档并且属于主用户文档。

所以,我想到的另一种方法是简单地为主用户文档打个补丁:

PATCH - /users/:id/

哪种休息路线结构对于完成这些任务是正确的?

Let's say we had the following User document How should we proceed using a rest api?

将文档视为文档:在本地进行编辑,然后将结果发送回服务器。

假设此文档可在 /users/1/ 获得,我们将只发回删除爱好的表示...

PUT /users/1/

{
  "_id": "1",
  "firstName": "Joe",
  "hobbies": [
   ],
}

使用 PATCH 而不是 PUT 就可以了(前提是我们要发送补丁文档作为 message-body)。从技术上讲,您也可以使用 POST,但 POST 在这里并没有真正为您提供任何优势。

/users/:id/hobbies
/users/:id/hobbies/:id

像这样使用标识符的问题在于,通用客户端不会认识到它们与 /users/:id/ 有任何关系 - 因此即使您发送消息删除爱好,客户端的本地缓存副本不会更新(因为它使用不同的密钥)。

现在,如果您的资源是使用 links

设计的
{
  "_id": "1",
  "firstName": "Joe",
  "hobbies": [ { "href": "/users/1/hobbies/4" } ]
}

那么我们仍然会使用 collection 中的 /users/1/ 到 add/remove 爱好,但是如果我们想修改爱好本身的表示,那么我们将使用以下方式发送消息/users/1/hobbies/4.

如果爱好 collection 本身就是 link...

{
  "_id": "1",
  "firstName": "Joe",
  "hobbies": "/users/1/hobbies"
}

然后我们会 add/remove 发消息给 /users/1/hobbies

考虑网页可能会有所帮助 - 网页的 HTML 表示通常会包含 link 与页面本身分开获取和缓存的图像或脚本。如果我们想编辑 HTML,我们会使用页面标识符发送请求,如果我们想更改脚本,我们会发送脚本标识符。