1

在 CanJS.com 上,它说不要从 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
}
4

2 回答 2

3

这主要是 JSON 数据源的安全问题。CanJS.com 上的“与服务器对话”下,它说:

findAll 还将接受来自服务的数组,但您可能不应该从 JSON 服务返回数组

这链接到一个关于JSON 漏洞的页面,该页面解释了由于从脚本标签加载时仅数组响应被认为是有效的 JavaScript src,这可用于通过类似 XSS 的攻击来公开安全数据。通过命名您的阵列,您正在减轻攻击。

CanJS 将处理纯 JSON 数组响应,但仅数组 JSON 响应存在安全问题。如果您只加载单个数据项,则单个对象就可以了。然而,如果你需要加载一个列表,你需要在某个地方使用一个数组,这样can.Model.List才能正确处理它——将它放在一个data键下允许它这样做而不会产生安全风险。

此外,当您正确命名数据时,您可以包含将加载的其他属性,can.Model.Listasavoy 的答案中所述。

于 2014-09-22T18:16:50.100 回答
0

对于返回单个模型实例的端点,可以返回:

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

对于返回模型实例列表的端点(这是文档所指的),建议将数组保存在一个data键下。这样它会自动工作,您可以更轻松地添加分页数据。以外的字段data将被添加到can.Model.List对象中。

{
    "data": [
        { "id": 1, name: "bob" },
        { "id": 2, name: "billy" }
    ],
    "page": 1,
    "totalPages": 10
}
于 2014-09-22T14:39:23.807 回答