Api REST:处理计算的和相关的资源属性

Api REST:处理计算的和相关的资源属性,api,mongodb,rest,mongoose,Api,Mongodb,Rest,Mongoose,假设我有一个类似Wordpress的博客系统,其资源包括用户、帖子和评论资源。这些资源中的每一个都作为一个单独的集合存储在MongoDB数据库中,它们通过ObjectID值字段相互关联。具体来说:一篇文章有一个作者字段,其中包含其相关用户资源的ObjectID;一篇评论有一个作者字段,用于相关用户,还有一个相关文章字段,用于评论所应用的文章的ObjectID 显然,在许多情况下,单独检索这些资源效率低下。例如,在客户端显示一个特定的帖子资源:理想情况下,该帖子作者的姓名应该与帖子标题和正文一起显

假设我有一个类似Wordpress的博客系统,其资源包括用户、帖子和评论资源。这些资源中的每一个都作为一个单独的集合存储在MongoDB数据库中,它们通过ObjectID值字段相互关联。具体来说:一篇文章有一个
作者
字段,其中包含其相关用户资源的ObjectID;一篇评论有一个
作者
字段,用于相关用户,还有一个
相关文章
字段,用于评论所应用的文章的ObjectID

显然,在许多情况下,单独检索这些资源效率低下。例如,在客户端显示一个特定的帖子资源:理想情况下,该帖子作者的姓名应该与帖子标题和正文一起显示,但帖子文档本身只包含相关用户文档的ObjectID

简单的解决方案是在服务器端检索这些相关属性,并向客户端发送附加数据。虽然这是一个很好的解决方案,对于像我描述的博客这样简单的东西来说,它会为更复杂的系统带来一些问题。具体而言:

  • 如果
    GET/api/posts/#{postID}
    返回的JSON对象的属性不是给定Post文档的真正属性,我如何通知客户机这一点
  • 作为第一个问题的扩展:如何告知客户机,尝试使用
    POST
    将该文档的给定字段更新到相同的URI实际上不会更新资源
  • 对于
    GET/api/posts/#{postID}
    来说,只返回该文档上真正存在的属性,使用像
    /api/posts/#{postID}/withauthor这样的辅助URI返回文档和相关信息是否更合适
更具体地说,假设这些资源由以下Mongoose.js样式的模式定义:

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服务的记录程度。

这非常有用。谢谢你的详细解释。