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

または、データ項目が 1 つしかない場合、そのdataフィールドはもう必要ありませんか? 例えば:

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

2 に答える 2

3

これは、主に JSON データ ソースのセキュリティ上の問題です。CanJS.comの「Talking to the Server」の下に、次のように書かれています。

findAll はサービスからの配列も受け入れますが、おそらく JSON サービスから配列を返すべきではありません

これはJSON の脆弱性に関するページにリンクしています。このページでは、配列のみの応答がスクリプト タグからロードされたときに有効な JavaScript と見なさsrcれるため、これを使用して XSS のような攻撃で安全なデータを公開できることを説明しています。配列の名前空間を設定することで、攻撃を軽減しています。

CanJS はプレーンな JSON 配列応答を処理しますが、配列のみの JSON 応答にはセキュリティ上の問題があります。個々のデータ項目のみをロードする場合は、単一のオブジェクトで問題ありません。ただし、リストをロードする必要がある場合は、can.Model.List正しく処理できるようにどこかで Array を使用する必要がありdataます。これをキーの下に配置すると、セキュリティ リスクを発生させることなく実行できます。

さらに、データを適切に名前空間化すると、 asavoy の回答can.Model.Listに記載されているように、一緒にロードされる他のプロパティを含めることができます。

于 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 に答える