2014-09-22 38 views
1

On CanJS.com,it says not to return an array from a JSON service by itself。相反,它應該是這樣的:爲什麼我應該在can.Model的`data`字段下放置JSON服務器響應?

{ 
    "data": [ 
     {"id":1, "description":"Do the dishes."}, 
     {"id":2, "description":"Mow the lawn."}, 
     {"id":3, "description":"Finish the laundry."} 
    ] 
} 

爲什麼這是必要的,而且它僅適用於數組或它適用於所有對象?例如,單個對象響應應該是這樣嗎?

{ 
    data: {"id": 5, "createdAt": 2234234329} 
} 

或者,如果只有一個數據項,是data場不再有必要嗎?例如:

{ 
"id": 5, "createdAt": 2234234329 
} 

回答

3

這主要是JSON數據源的安全問題。"Talking to the Server" on CanJS.com,它說:

的findAll也將接受來自服務,但you probably should not be returning an array from a JSON service數組。

該鏈接指向一個關於JSON vulnerability網頁,其中解釋說,因爲當src從腳本標記加載了一個只有陣列響應被認爲是有效的JavaScript,這可以用來與XSS樣發作暴露安全數據。通過命名你的陣列,你可以緩解攻擊。

CanJS將處理一個普通的JSON數組響應,但是隻有數組的JSON響應存在安全問題。如果你只加載一個單獨的數據項,一個單獨的對象將會很好。但是,如果您需要加載列表,則需要在某處使用數組,因此can.Model.List可以正確處理它 - 將其置於data鍵可以在不產生安全風險的情況下進行。

此外,當您正確命名數據的名稱空間時,可以包含其他屬性,如asavoy's answer中提到的can.Model.List一起加載。

0

對於返回單個模型實例端點,它的罰款,返回此:

{ 
    "id": 1, name: "bob" 
} 

對於返回模型實例的列表端點(這是什麼文檔所指到),陣列建議保存在data密鑰下。這樣它將自動工作,並且您可以更輕鬆地添加分頁數據。 data以外的字段將被添加到can.Model.List對象中。

{ 
    "data": [ 
     { "id": 1, name: "bob" }, 
     { "id": 2, name: "billy" } 
    ], 
    "page": 1, 
    "totalPages": 10 
} 
相關問題