宁静响应中的json数据是否应包含对象类型信息?

时间:2012-01-09 17:37:45

标签: javascript json rest backbone.js

假设我们想要填充一些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中的模型类型信息将丢失。

4 个答案:

答案 0 :(得分:2)

每个REST对象使用不同的端点(url)。因此,网址包含“哪种模式”信息。

每个模型都是变量和(固定)类型的固定集合。

因此通常无需通过线路发送动态类型信息。

已添加重新评论来自@ali -

的评论

正确。但是你现在要问一个不同的/更精确的问题:“如何在不引起许多http请求的情况下处理Backbone模型的初始负载?”我不确定这个问题的最佳答案。一种方法是告诉骨干网下载多个模型集合。

这会减少每个模型一个调用的次数,而不是每个模型实例调用一次。

第二种方式是从服务器下载当前数据树的非REST调用/响应。这是个好主意。浏览器 - 客户端可以接收响应,然后按模型将其提供给主干。请务必向用户提供有关正在发生的事情的一些反馈。

Re:嵌套模型。这是一个SO q

答案 1 :(得分:1)

考虑到,正如在其他答案中已经说过的那样,在REST中,每个资源都有自己的端点,因此您尝试做的事情(即隐藏单个端点后面的所有模型)并不完全符合REST,恕我直言。这本身并不重要。

嵌套集合可以作为答案。

"包装" collection在初始时从单个端点获取所有模型,并将它们推送到相应的集合。当然你必须在json中发送类型信息。

从那时起,每个"内部"集合对自己的事件做出反应,并处理自己的端点。

只要您了解这种优化,我就不会发现这些优化存在巨大问题。

答案 2 :(得分:0)

  1. REST与来回发送的内容无关。它只处理如何状态转移。 JSON(你似乎正在使用的协议)将指示需要发送的内容,据我所知,它并没有规定。
  2. 在JSON有效负载中包含类型信息实际上取决于您使用的库。如果它让你更容易使用JSON来包含类型,那么我会说把它放进去。如果不是,就把它留下来。

答案 3 :(得分:0)

当你有一个扩展另一个的模型时,它真的很有用。指出专门使用哪种型号消除混淆