假设我们想要填充一些javascript模型(例如backbone.js模型),给出来自这样的服务器的json响应:
{
"todo": {
"title": "My todo",
"items": [
{ "body": "first item." },
{ "body": "second item"}
]
}
}
此数据不包含类型信息,因此当我们看到"todo"
键时,我们不知道要填充哪个模型。
当然,可以创建一些自定义标准来将json响应对象中的键链接到客户端模型。例如:
{
"todo": {
"_type": "Todo",
"title": "My todo",
...
}
}
虽然这适用于对象,但它在列表中会变得很尴尬:
"items": {
"_type": "TodoItem",
"_value": [
{ "body": "first item." },
{ "body": "second item"}
]
}
在创建此自定义规则之前,问题是:
是否有关于在响应数据中包含客户端类型信息的RESTful准则?
如果没有,在响应json中包含客户端类型信息是个好主意吗?
除了填充模型的整个方法之外,还有哪些其他选择?
修改
虽然可以从网址中检索模型类型,例如/todo
和/user
,但这种方法的问题在于N个模型的初始种群意味着N个http请求。
相反,初始填充可以从只有1个请求的单个大合并树完成。在这种情况下,URL中的模型类型信息将丢失。
答案 0 :(得分:2)
每个REST对象使用不同的端点(url)。因此,网址包含“哪种模式”信息。
每个模型都是变量和(固定)类型的固定集合。
因此通常无需通过线路发送动态类型信息。
已添加重新评论来自@ali -
的评论正确。但是你现在要问一个不同的/更精确的问题:“如何在不引起许多http请求的情况下处理Backbone模型的初始负载?”我不确定这个问题的最佳答案。一种方法是告诉骨干网下载多个模型集合。
这会减少每个模型一个调用的次数,而不是每个模型实例调用一次。
第二种方式是从服务器下载当前数据树的非REST调用/响应。这是个好主意。浏览器 - 客户端可以接收响应,然后按模型将其提供给主干。请务必向用户提供有关正在发生的事情的一些反馈。
Re:嵌套模型。这是一个SO q。
答案 1 :(得分:1)
考虑到,正如在其他答案中已经说过的那样,在REST中,每个资源都有自己的端点,因此您尝试做的事情(即隐藏单个端点后面的所有模型)并不完全符合REST,恕我直言。这本身并不重要。
嵌套集合可以作为答案。
"包装" collection在初始时从单个端点获取所有模型,并将它们推送到相应的集合。当然你必须在json中发送类型信息。
从那时起,每个"内部"集合对自己的事件做出反应,并处理自己的端点。
只要您了解这种优化,我就不会发现这些优化存在巨大问题。
答案 2 :(得分:0)
答案 3 :(得分:0)
当你有一个扩展另一个的模型时,它真的很有用。指出专门使用哪种型号消除混淆