Api REST:处理计算的和相关的资源属性
假设我有一个类似Wordpress的博客系统,其资源包括用户、帖子和评论资源。这些资源中的每一个都作为一个单独的集合存储在MongoDB数据库中,它们通过ObjectID值字段相互关联。具体来说:一篇文章有一个Api REST:处理计算的和相关的资源属性,api,mongodb,rest,mongoose,Api,Mongodb,Rest,Mongoose,假设我有一个类似Wordpress的博客系统,其资源包括用户、帖子和评论资源。这些资源中的每一个都作为一个单独的集合存储在MongoDB数据库中,它们通过ObjectID值字段相互关联。具体来说:一篇文章有一个作者字段,其中包含其相关用户资源的ObjectID;一篇评论有一个作者字段,用于相关用户,还有一个相关文章字段,用于评论所应用的文章的ObjectID 显然,在许多情况下,单独检索这些资源效率低下。例如,在客户端显示一个特定的帖子资源:理想情况下,该帖子作者的姓名应该与帖子标题和正文一起显
作者
字段,其中包含其相关用户资源的ObjectID;一篇评论有一个作者
字段,用于相关用户,还有一个相关文章
字段,用于评论所应用的文章的ObjectID
显然,在许多情况下,单独检索这些资源效率低下。例如,在客户端显示一个特定的帖子资源:理想情况下,该帖子作者的姓名应该与帖子标题和正文一起显示,但帖子文档本身只包含相关用户文档的ObjectID
简单的解决方案是在服务器端检索这些相关属性,并向客户端发送附加数据。虽然这是一个很好的解决方案,对于像我描述的博客这样简单的东西来说,它会为更复杂的系统带来一些问题。具体而言:
- 如果
返回的JSON对象的属性不是给定Post文档的真正属性,我如何通知客户机这一点GET/api/posts/#{postID}
- 作为第一个问题的扩展:如何告知客户机,尝试使用
将该文档的给定字段更新到相同的URI实际上不会更新资源POST
- 对于
来说,只返回该文档上真正存在的属性,使用像GET/api/posts/#{postID}
/api/posts/#{postID}/withauthor这样的辅助URI返回文档和相关信息是否更合适
User: {
_id: ObjectID,
username: String,
name: {
first: String,
last: String
}
}
Post: {
_id: ObjectID,
author: ObjectID,
title: String,
body: String,
timestamp: Date
}
Comment: {
_id: ObjectID,
author: ObjectID,
relatedPost: ObjectID,
title: String,
body: String,
timestamp: Date
}
我想要一个GET
-able资源,它返回一个Post文档的完整表示以及相关作者的名字和姓氏,如下所示:
request: GET /api/posts/529635f828ab08e00d000084
response: {
_id: "529635f828ab08e00d000084",
title: "A Post",
body: "It turns out I have very little to say.",
author: {
_id: "928495a321cf09c11d198001",
name: {
first: "John",
last: "Smith"
}
}
我不想让客户相信更新author.name.first
和POST
——将JSON添加到同一URI会对后端文档的author
属性产生任何影响。只有对author.\u id
的更新才能更改文档的作者。有没有一种通用的“RESTful”方法
我知道这里没有单一的正确答案,我前面描述的简单方法将适用于这个特定的问题。但我很好奇其他人是如何在更复杂的API中处理这个问题的
(注意:我很可能是想得太多了。)这是设计RESTful服务时经常遇到的问题。我发现处理这个问题的最好方法是正确地记录RESTful服务(甚至可能为客户提供一个游乐场环境来试用API)。下面是我将如何处理您的用例 我将有一个获取给定blog_post的请求,该请求只返回blog_post实体 GET/api/posts/abcd1234 返回带有作者id的基本博客文章 现在,我将对相同的GET请求进行修改,如下所示: GET/api/posts/abcd1234?comments=true&authors=true&startIndex=0&offset=10&sortDirection=升序&sortBy=comment\u日期 上面的api将返回作者的帖子和作者的评论列表,以及与分页等相关的一些其他过滤器。客户端可以在此api过滤器上使用他们喜欢的任何排列组合,并且根据过滤器的不同,返回数据,类似于 博文:{ 您的正常博客文章字段在这里 这里是完整的作者对象 评论:[{ 评论列表(每个评论的作者和应用的过滤器)在这里 }] } 这也将维护您对同一博客文章上的其他请求的RESTful方法。例如,更新博客文章的作者 POST/api/posts/abcd1234 仍然只会更新blog_post中的authorId,因为您记录此post请求的方式只是让客户端知道,您在这里唯一需要的是一个blog_post对象,其id、标题、主体、authorId以及作为blog_post请求的一部分发送给您的所有其他字段都将被丢弃/忽略
客户将如何使用您的REST服务,这在很大程度上取决于您对REST服务的记录程度。这非常有用。谢谢你的详细解释。