在CanJS.com上,it says not to return an array from a JSON service by itself。相反,它应该是这样的:
{
"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
}
答案 0 :(得分: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
键下允许它这样做而不会产生安全风险。
此外,当您正确地命名数据时,您可以包含将与can.Model.List
中提到的{{1}}一起加载的其他属性。
答案 1 :(得分:0)
对于返回单个模型实例的端点,可以返回此信息:
{
"id": 1, name: "bob"
}
对于返回模型实例列表的端点(这是文档所指的内容),建议将该数组保存在data
键下。这样它就会自动运行,您可以更轻松地添加分页数据。 data
以外的字段将添加到can.Model.List
对象。
{
"data": [
{ "id": 1, name: "bob" },
{ "id": 2, name: "billy" }
],
"page": 1,
"totalPages": 10
}