8

私はRESTにはかなり慣れていませんが、収集した限りでは、次のURLがRESTの原則に準拠していることを理解しています。リソースは次のように配置されます。

/user/<username>/library/book/<id>/tags
          ^         ^           ^   ^
          |---------|-----------|---|- user resource with username as a variable
                    |-----------|---|- many to one collection (books)
                                |---|- book id 
                                    |- many to one collection (tags)


GET /user/dave/library/book             //retrieves a list of books id's
GET /user/dave/library/book/1           //retrieves info on book id=1
GET /user/dave/library/book/1/tags      //retrieves tags collection (book id=1)

しかし、このサンプル API を最適化するにはどうすればよいでしょうか? たとえば、ライブラリに 1 万冊の本があり、ライブラリ内のすべての本の詳細を取得したいとします。/library/book/<id>で指定されたすべての ID に対してhttp 呼び出しを強制する必要があり/library/bookますか? または、複数の ID をパラメーターとして有効にする必要がありますか? /library/book/<id1>,<id2>...一度に 100 個の ID を一括フェッチするのは好きですか?

この種の状況について、REST の原則は何と言っていますか? あなたの意見は何ですか?

再度、感謝します。

4

4 に答える 4

5

これは厳密には設計上の問題です。

bookcリソースを定義して、次のように使用できます。

GET /user/dave/library/book?bookList=...

引数をさらにどのように指定するbookListかは、実際には、このリソースの使用方法を想定する問題です。たとえば、次のようになります。

GET /user/dave/library/book?bookList=1-10
GET /user/dave/library/book?bookList=1,2,5,20-25

または、すべての本をページごとに表示することもできます。

GET /user/dave/library/book?page=7&pagesize=50

しかし、私の考えでは、特に「ランダムな」ID の長いリストを含むフォームは、かなり不適切に思えます。たぶん、代わりにfilterパラメーターを定義して、次を指定できるようにします。

GET /user/dave/library/book?filter=key,value&filter=key,value

HTTP URL の長さ制限に関するご質問については、標準では何も設定されていません。ただし、ブラウザは異なる場合があります...このSOトピックを見てください

より厳密に RESTful にするために、HTTP ヘッダーを介してクエリ パラメーターを指定することもできますが、伝えたかった一般的な考え方は変わりません。

これがあなたに適していることを願っています...

于 2011-05-31T16:07:59.493 に答える
5

上記は見栄えがしますが、複数形の名前に変更すると、読みやすくなります。


/users/{username}/books/{bookId}

私が理解していないのは、コンマ区切りの ID リストを渡すユースケースです。問題は、ID を取得する方法です。ID のリストの背後にはセマンティクスがあると思います。つまり、ID はフィルターの結果を表します。したがって、ID を渡す代わりに、検索 API を使用します。単純な例:


/users/dave/books?puchasedAfter=2011-01-01
 

10,000 冊の本のコレクションを反復処理する場合は、ページング パラメータを使用します。

于 2011-05-31T20:08:18.807 に答える
0

ページネーターを使用できます

一部の安らかな API は、次のような巨大なリソースのページネーターと連携します。

http://example.org/api/books?page=2

サーバーは、たとえば 1 ページあたり 100 レコード (この場合は書籍) を配信します。sortbyまた、get リクエストでa を使用して本を並べ替えることができます。上記のリクエストを使用すると、101 から 200 冊の書籍が取得されます (データベースに多数の書籍がある場合)。応答は、本の量とページの量、次のページと前のページが何であるかについて何かを伝えることができますが、HATEOAS にさらに進みます。

それ以外の場合、特定の ID を取得したい場合は、次のようにします。

http://example.org/books?id=[]2&id=[]5&id=[]7&id=[]21

ID の配列 (id = [2,5,7,21]) を使用した get リクエストで、それぞれの ID を持つ本が返されます

于 2014-04-30T16:08:31.683 に答える
0

これは私の意見です:

GET /user/dave/library/book/IDList      //retrieves a list of books id's
or
GET /user/dave/library/bookID           //retrieves a list of books id's

GET /user/dave/library/book             //retrieves a list of books
GET /user/dave/library/book/1           //retrieves info on book id=1
GET /user/dave/library/book/1-3         //retrieves info on book id>=1 and id <=3
GET /user/dave/library/book/1/tags      //retrieves tags collection (book id=1)
于 2011-05-31T16:08:17.713 に答える