2012-07-25 32 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