Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript restful响应中的json数据是否应该包含对象类型信息?_Javascript_Json_Rest_Backbone.js - Fatal编程技术网

Javascript restful响应中的json数据是否应该包含对象类型信息?

Javascript restful响应中的json数据是否应该包含对象类型信息?,javascript,json,rest,backbone.js,Javascript,Json,Rest,Backbone.js,假设我们想要填充一些javascript模型(例如backbone.js模型),给定来自如下服务器的json响应: { "todo": { "title": "My todo", "items": [ { "body": "first item." }, { "body": "second item"} ] } } 此数据不包含类型信息,因此当我们看到“todo”键时,我们不知道要填充哪个模型 当然,可以创建一些自定义标准,将json响应

假设我们想要填充一些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中包含客户端类型信息是否是一个好主意

  • 除了填充模型的整个方法之外,还有什么其他的替代方法

编辑

虽然可以从url中检索模型类型,例如
/todo
/user
,但这种方法的问题是,N个模型的初始填充将意味着N个http请求

相反,初始填充可以从一个只有1个请求的大型合并树中完成。在这种情况下,url中的模型类型信息将丢失

  • REST与来回发送的内容无关。它只涉及国家如何转移。JSON(您似乎正在使用的协议)将指示需要发送的内容,而据我所知,它并没有规定这一点
  • 在JSON负载中包含类型信息实际上取决于您使用的库。如果使用JSON来包含类型更容易,那么我会说将其放入。如果没有,就不要说了
  • 每个REST对象使用不同的端点(url)。因此,url包含“哪种型号”信息

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

    因此,通常不需要通过线路发送动态类型信息

    添加了@ali的评论--

    对。但您现在提出了一个不同的/更精确的问题:“如何在不引起许多http请求的情况下处理主干模型的初始负载?”我不确定这个问题的最佳答案。一种方法是让主干网下载多个模型集合

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

    第二种方法是使用非REST调用/响应从服务器下载当前数据树。这是个好主意。浏览器客户端可以接收响应,然后逐个模型地将其送入主干网。一定要给用户一些关于正在发生的事情的反馈


    Re:嵌套模型。这是一张照片

    考虑一下,正如在其他答案中所说的,在REST中,每个资源都有自己的端点,因此您试图做的事情(即将所有模型隐藏在一个端点后面)并不完全符合REST,IMHO。这本身没什么大不了的

    这里的答案可能是嵌套集合

    “包装器”集合在初始化时从单个端点获取所有模型,并将它们推送到各自的集合中。当然,您必须在json中发送类型信息

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


    我不认为这种优化有什么大问题,只要你知道。

    当你有一个模型扩展另一个模型时,它真的很有用。指出具体使用哪种模型可以消除混淆

    这是一个很好的观点,但这种方法的问题是初始的大树填充:如果我们有10个不同的模型要初始填充,我们不希望发送10个http请求来填充每个模型。而且,使用这种方法意味着没有嵌套模型。你将如何用这种方法处理这些问题?第二种方法让我们回到原来的问题。当“一个模型一个模型地输入”时,我们如何知道哪些数据与哪个模型关联?树响应将是一个json obj,每个模型都有一个数组。例如,属性(每个都是一个数组)将是用户、帖子、评论等。它们将与用户、帖子、评论模型的集合相匹配。数组名称(用户)将指示数组元素是用户模型。这种命名风格来自Rails,它工作得很好。您所描述的类似于
    {“posts”:[…],“comments”:[…],…}
    ,它不是真正的树。树类似于:
    “posts”:[{“comments”:[…]},…]
    。仅当每个树节点只有一个模型类型时,根据约定将键关联到模型类型才有效。例如,当一篇文章有
    启用的\u注释
    禁用的\u注释
    时,两者都具有相同的集合类型。为什么将所有模型关联到一个端点不是RESTful的?单端点资源包装器不能被认为是资源本身吗?我正是这样写的,但感觉有点牵强:)基本原理是:在应用程序中,您不会将整个状态对象作为资源来操作,而是操作单个模型,而这些是您的资源。现在我同意你的观点,你说的任何话都是一种资源,它是一种资源:我同意,它是哲学的(让我想起了后与后的辩论)。