【问题标题】:Backbone collections, REST, and Bare Arrays主干集合、REST 和裸阵列
【发布时间】:2012-07-25 22:59:00
【问题描述】:

在 Backbone 中,它是 seems to be encouraged that collection resources return bare arrays。这似乎是driven by the Rails model of doing things,这不是做某事的充分理由根本。我对此有一些问题:

  1. 通常,“集合”资源还需要围绕它的上下文。至少,我喜欢在响应中包含资源 URI 的约定。其他内容,如分页、小计(例如在购物车中)等,意味着集合很少“裸露”。
  2. 据说裸阵列存在安全问题。我在一些地方听说过,但需要一些参考资料来确认。

另一方面,我可以看到“裸”数组如何使 API 更自然:

  1. 集合中每个对象的格式往往与在该集合中创建/更新对象时的格式相同。
  2. “集合”在语义上很好地映射到项目集合的概念。

免责声明:这里的前提可能完全有缺陷。我意识到 REST 不仅仅是 HTTP 动词和 JSON。

【问题讨论】:

  • 有趣的讨论,Jon... 我曾经以几乎相同的方式思考收藏;特别是关于你的第一句话。但我开始将集合仅视为另一个界面,用于将资源数据呈现为类似项目的集合。这可以作为一个数组或一个对象来找我。我有责任将其呈现为类似项目的列表;这就是 Collection.parse 无价的地方。让一个单独的同步对象来处理实际的 CRUD 操作也很有意义,它强制执行集合仅代表后端数据的想法。

标签: rest collections backbone.js hypermedia


【解决方案1】:

您引用的安全问题是一个 CSRF 漏洞,原因是脚本包含请求的 JSON 数组可以通过覆盖本机 javascript Array 类型来评估。 Here's a good explanation of the vulnerability。 AFAIK,这对于普通的 JSON 对象是不可能的。

但是,Backbone 不会阻止您包装您的收藏响应。您可以覆盖 Backbone.Collection.parse 以“解包”或在填充集合之前修改原始响应。

var MyCollection = Backbone.Collection.extend({
  model:MyModel,
  parse: function(response) {
    //Assume the response looks like { "data": [ ... ] }
    return response.data;
  }
});

我通常更喜欢包装收集响应,不仅出于安全原因,还因为它允许 API 具有更大的灵活性和更改弹性。

【讨论】:

  • 是的,这正是我目前正在做的事情,而且很可能会继续这样做。我们有时会覆盖sync 方法,这取决于我们在检索资源时想要多大的灵活性。也感谢您提供解释链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2012-10-15
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多