【问题标题】:Should json data in a restful response contain the object type information?restful 响应中的 json 数据是否应该包含对象类型信息?
【发布时间】:2012-01-09 17:37:45
【问题描述】:

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

【问题讨论】:

    标签: javascript json rest backbone.js


    【解决方案1】:

    每个 REST 对象使用不同的端点 (url)。所以url包含了“哪个型号”的信息。

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

    因此通常不需要通过网络发送动态类型信息。

    添加回复@ali的评论--

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

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

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

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

    【讨论】:

    • 这是一个很好的观点,但是这种方法的问题是初始的大树填充:如果我们最初要填充 10 个不同的模型,我们不想发送 10 个 http 请求来填充每个模型。此外,使用这种方法意味着没有嵌套模型。您将如何使用这种方法处理这些问题?
    • 第二种方法让我们回到最初的问题。当“逐个模型输入”时,我们如何知道哪些数据与哪个模型相关联?
    • “树响应”将是一个 json obj,每个模型都有一个数组。例如,属性(每个都是一个数组)将是用户、帖子、cmets 等。它们将与用户、帖子、评论模型的集合相匹配。数组名称(用户)表明数组元素是用户模型。这种命名风格来自 Rails,效果很好。
    • 你所描述的就像{"posts": [...], "comments": [..], ...} 这不是真正的树。一棵树就像:"posts": [{"comments": [...]}, ...]。根据约定,将键关联到模型类型仅在每个树节点只有一种模型类型时才有效。例如,当一个帖子有 enabled_commentsdisabled_comments 时,两者都具有相同的集合类型。
    【解决方案2】:

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

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

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

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

    只要您意识到这一点,我看不出这种优化有什么大问题。

    【讨论】:

    • 为什么将所有模型关联到一个端点不是 RESTful?难道那个单一端点资源包装器不能被认为是资源本身吗?
    • 我就是这么写的,虽然感觉有点牵强 :) 理由是:在您的应用程序中,您不会将整个状态对象作为资源来操作,而是您将操作单个模型,并且这些是你的资源。现在我同意你的观点,你所说的任何东西都是一种资源,它是一种资源:D 它变得很哲学,我同意(让我想起了 POST 与 PUT 的辩论)。
    【解决方案3】:
    1. REST 与来回发送的内容无关。它只处理如何状态转移。 JSON(您似乎正在使用的协议)将指示需要发送的内容,据我所知,它并没有规定。
    2. 在 JSON 负载中包含类型信息实际上取决于您使用的库。如果它使您更容易使用 JSON 来包含类型,那么我会说把它放进去。如果没有,就把它排除在外。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-16
        • 1970-01-01
        • 2015-03-28
        • 2017-04-29
        • 2017-06-11
        相关资源
        最近更新 更多