我有一个小型REST API,由Backbone.js提供支持的单页面Web应用程序使用
API提供了两种资源类型,因此Backbone应用程序使用。这些是文章和评论。这两个资源具有不同的端点,每个文章都有一个链接到该项目的所有评论的位置。
我面临的问题是,在我的网络应用程序的文章列表中,我希望能够显示每篇文章的评论数量。鉴于只有在我获得评论列表时才能实现这一点,在当前设置中,需要我发出一个API请求以获取初始文章列表,并且每个文章的另一个请求能够计算数字评论。例如,如果有100篇文章,则会成为问题,因此填充单个视图需要101个HTTP请求。
我现在能想到的解决方案是:
1。将评论数据包含在初始文章请求中
{
{
"id": 1,
"name": "Article 1",
...
"comments": {
{
"id": 1,
"text": "some comment"
},
{
"id": 2,
"text": "some comment"
},
...
}
},
}
本案例中的问题是:如何将“评论”解析为单独的评论集合,而不是将其包含在文章模型中?
2。在文章响应中包含一些元数据,如下所示:
{
{
"id": 1,
"name": "Article 1",
...
"comments": 13
},
}
提出问题的选项:我应该如何处理模型的解析,以便一方面可以获得元信息,另一方面,“comments”属性不是一个Backbone会尝试执行更新上?
我觉得可能有其他解决方案,符合REST理念,因此我很遗憾,所以如果您有任何其他建议请告诉我。
答案 0 :(得分:0)
我认为您最好的选择是使用您的第二个选项,包括文章模型中每篇文章的评论数量。
提出问题的选项:我应该如何处理模型的解析,以便一方面可以获得元信息,另一方面,“comments”属性不是一个Backbone会尝试执行更新上?
不确定您的顾虑是什么。为什么你会担心评论属性会更新?
我想不出任何其他“RESTy”方式来实现你想要的结果。
答案 1 :(得分:0)
我建议使用备选方案2并让服务器返回
一个被视为有用的文章属性的子集
处理文章集合资源时的应用程序
(也许可以/articles
)到达。
完整的文章成员资源及其所有评论(是否
它们存储在后端的单独表中
可在/articles/:id
)获得。
从Backbone.js的角度来看,你可能想要把它
例如,ArticleCollection
中的收集资源
转换每个成员(当前具有属性的子集)
到Article
模型。
当用户选择完整地查看文章时,请将其拉出
从ArticleCollection
出来并调用fetch
来填充
它完整。
关于如何处理包含的额外/虚拟属性
在集合资源(/articles
)中,如评论计数和
可能还有其他用途的聚合,我看到了一些选择:
Article#initialize
中,您可以将其从attributes
中删除
并将它们存储为文章中的元数据。这种方式内置
Backbone.Model#toJSON
将无法看到它们。attributes
部分并覆盖
“序列化”Backbone.Model#toJSON
时,Article
会驱逐他们。在atlernative 1中,Article#commentCount()
帮助者可以返回
this._commentCount || this.get('comments').length
让它发挥作用
部分和满载的文章。
对于满载的Article
,你可能想转换它
无论如何,嵌套comments
数组成为一个完整的CommentCollection
并将其存储在this._comments
中,所以我不认为这是不寻常的
让模型直接在模型实例上存储其他内容,
在attributes
哈希之外。