2012-07-25 83 views
1

在主干中,它seems to be encouraged that collection resources return bare arrays。这似乎是driven by the Rails model of doing things,这不是一个很好的理由在所有做些事情。我有这个几个问题:主干集合,REST和裸阵列

  1. 通常,'集合'资源也需要它周围的上下文。至少,我喜欢在响应中包含资源URI的约定。其他的东西,如分页,小计(例如在购物车中)等意味着集合很少是“裸露”的。
  2. Bare Arrays据说有安全问题。我在几个地方听到过这个消息,但需要一些参考文件才能确认。

在另一方面,我可以看到“裸”的阵列将成为一个API更自然:

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

声明:这里的前提可能是完全有缺陷的。我意识到REST比HTTP动词和JSON多得多。

+0

有趣的讨论,乔恩...我曾经以几乎相同的方式思考收藏品;特别是关于你的第一句话。但是我只是将集合看作是另一个将_presenting_资源数据作为类似项目集合的接口。这可能会以数组或对象的形式出现。我有责任将其列为相似项目列表;这就是Collection.parse非常重要的地方。有一个独立的同步对象处理实际的CRUD操作也是有意义的,强化集合仅仅代表后端数据的想法。 – 2012-07-25 17:51:37

回答

2

您引用的安全问题是由脚本包含的JSON数组可以通过覆盖原生javascript Array类型来评估的事实导致的CSRF漏洞。 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中更大的灵活性和变化的弹性。

+0

是的,这正是我目前正在做的,而且很可能会继续。我们有时会重写'sync'方法,这取决于我们需要多少灵活性来检索资源。 感谢您的解释链接,也。 – 2012-07-25 16:18:24