如何使用 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,我们会使用页面标识符发送请求,如果我们想更改脚本,我们会发送脚本标识符。
假设我们有以下用户文档:
{
"_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,我们会使用页面标识符发送请求,如果我们想更改脚本,我们会发送脚本标识符。