为什么我应该在can.Model的`data`字段下放置JSON服务器响应?

时间:2014-09-22 14:05:51

标签: canjs canjs-model

在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
}

2 个答案:

答案 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
}