web-dev-qa-db-ja.com

RESTful APIで応答として配列を返す最良の方法は何ですか?

このようなリソースがあるとしましょう。

book:
    type: object
    properties:
        author: {type: string}
        isbn: {type: string}
        title: {type: string}

books:
    type: array
    items: book

したがって、誰かがBooksリソースでGETを作成すると、次のようになります

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
 {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

職場の誰かから、推奨されるRESTプラクティスは常にJSONオブジェクトとして応答を返すことです。つまり、booksのスキーマは次のようになります。

books:
    type: object
    properties:
        list:
            type: array
            items: book

したがって、今、応答は次のようになります、

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
             {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

どれがベストRESTプラクティスですか?

45
borncrusader

実際には、2番目のオプションがベストプラクティスです。これは、配列を返すだけではリソースを拡張できないためです。

例:すべてのレコードの数を追加する必要がある場合は、配列のみのアプローチですでに完了しています。

それが1つのリストAPIで発生する場合は、一貫性を保つためにすべてのオブジェクトを作成する必要があります。そうすると、APIの一貫性が高まり、開発者にとって使いやすくなります。

例:開発者がAPIを使用してリストと詳細ページを表示する一般的なコードを書いたとしましょう。場合によっては配列であったり、場合によってはリストプロパティを持つオブジェクトであったりするため、例外を構築したくありません。

この回答は全体として、休息、ハテオア、その他のプロトコルに関する原則とは関係ありませんが、クライアントに送信する必要のあるデータについて本物であるだけです。たとえばハテオをフォローすることにした場合は、コースの基準(オブジェクトでもある)を使用します。

37
Luc Franken

どちらも

[{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},{"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]

そして

{
    "list": [{"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
         {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}]
}

有効なJsonです。 「リスト」が不要な場合は追加しないでください。その後に続くものがリストではなく配列であるため、混乱を招く可能性さえあります。

ベストREST実践?APIはAcceptヘッダーで設定されたものすべてに適切な応答を提供し、優れたドキュメントも提供する必要があります。

9
imel96

応答をJSON準拠にする理由は次のとおりですJSONは事実上の標準です; JSONパーサーを備えた任意の言語で簡単に構文解析でき、JavaScriptを使用している場合はパーサーも必要ありませんJavaScriptはそれをネイティブに理解するからです。

つまり、JSONに準拠させれば、独自のパーサーを作成する必要がなくなります。さらに、次の開発者がサービスを利用するソフトウェアを作成しても、驚くことはありません。

RESTはJSONスキーマとは何の関係もありません。 RESTの観点から、どちらのスキーマも許容されます。

7
Robert Harvey

2番目のオプションも、セキュリティ上の理由から推奨される方法です。古いブラウザにはセキュリティの脆弱性があり、JSON配列として返された場合、Webページ上の他のJavaScriptコードがデータを盗む可能性があります。したがって、これまでのベストプラクティスはJSON配列を返さないことでした。実際、配列を渡すときに「json-ify」機能がデフォルトでオプション2を選択するフレームワークがいくつかありました。

https://stackoverflow.com/questions/3503102/what-are-top-level-json-arrays-and-why-are-they-a-security-risk

http://ejohn.org/blog/re-securing-json/

5
Chuck

単一の無意味なキー「リスト」と配列値を持つ辞書は無意味です-代わりに配列を返します。

同じサービスが本、CD、またはDVDを返すことができる場合は、キー「books」と配列値を持つディクショナリを返すことができます。一連のDVDを持つ別の重要な「DVD」が存在する可能性があります。たとえば、顧客がすべての購入のリストを照会できる場合です。

応答が書籍のリストとしてのみ解釈されることが確実である場合(リクエストが「書籍のリストを提供してください」と言った場合)、配列のみで問題ありません。

5
gnasher729

どちらもjsonであり、RESTに準拠しています。私はあなたの場合リストを本に変えて、応答をより説明的にします。またはこのようなもの:

{ "responceObject" : {

   results : 2,

    "Books": [
        {"author": "Dan Brown", "isbn": "123456", "title": "Digital Fortress"},
        {"author": "JK Rowling", "isbn": "234567", "title": "Harry Potter and the Chamber of Secrets"}
    ]

}}
1
MeganFoxObama