Author
とBook
の2つのリソースを使用してAPIを作成しているとします。
したがって、REST apiを次のように設計します。
/books
/books/:id
/books/:id/authors
/authors
/authors/:id
/authors/:id/books
たとえば、/books/:id
は、指定されたBook
およびさまざまなid
sを使用してAuthor
を返す必要がありますか?または、与えられたBook
とさまざまなid
sのid
sを持つAuthor
を返す必要があります。これらは、/authors/:id
への一連のクエリを介してクエリできます。または/authors?ids=1,2,3
など
APIエンドポイントの代わりに、これらがWebサイト上のWebページである場合、どのように配置しますか?
あなたが間違っていると思った場合、またはさらに悪いことに、どうにかしてそれを複数の方法で行わなければならなかった場合、どうしますか?
ほとんどの場合、答えは次のとおりです。より多くのドキュメントを作成し、人々が自分に最適なドキュメントを確実に見つけられるようにリンクを追加します。
考えてみてください。インターネット上にはいくつのHemingway Webページがありますか?
Webはドメインではなく、ドキュメント管理システムです。すべてのHTTP動詞は、ドキュメント管理ドメインに適用されます。 URIはドメインオブジェクトにマップされません-これはカプセル化に違反しています。作業(例:ドメインモデルへのコマンドの発行)は、リソース管理の副作用です。つまり、リソースは腐敗防止層の一部です。統合ドメインには、ビジネスドメインでビジネスオブジェクトを実行するよりもはるかに多くのリソースが必要です。 - ジムウェバー2011
REST APIは、ドメインモデルをWebサイトに偽装する試みです。Webをガイドにしてください。
たとえば、/ books /:idは指定されたIDのブックとさまざまな著者を返す必要がありますか?または、指定されたIDとさまざまな著者のIDを含むブックを返す必要があります。これらは、/ authors /:idまたは/ authors?ids = 1,2,3などへの一連のクエリを介して照会できますか?
短い物語。 依存。
それは、クライアントが**消費**する方法、interactおよびdiscoverの本とその関連リソースに依存します。 Book
がクライアントに提供するデータを増やすか減らすかは、これらに依存します。
APIが単一のクライアントにのみフィードしている場合。モバイルアプリまたはWebアプリとしましょう。これらのアプリは灯台として機能します。彼らのニーズは、UX、使いやすさ、効率性などのニーズよりも適切な表現スイートを決定するために使用されます。
複数のクライアント用にWeb APIを開発している場合は異なります。すべてのクライアントにAPIを消費させる方法とすべてのデータに到達するために何回要求するか。他の多くのものの間で。
ビジネスも重要です。たとえばセキュリティなどの他の制約がある可能性があります。 どのユーザーも作成者のデータにアクセスできますか?ユーザーリストを作成して著者を検索できますか?ゲストユーザーにリソースの表示を許可しますか?はい?彼らはいくつのデータを見ることができますか?リソースを更新できますか?
@VoinceOfUnreasonはすでに良い点を作りました
REST APIは、ドメインモデルをWebサイトに偽装する試みです。Webをガイドにしてください。
これはHATEOASで概念化する方が簡単です
{
"title":"The Jungle Book",
"published":1894
"_link":{
"self":{ "href": "http://myserver/book/x"},
"authors":{ "href": "http://myserver/book/x/authors"}
},
"_embedded":{
"authors":[
{
"name": "Rudyard Kipling",
"_links:":{
"self":{ "href": "http://myserver/author/y"},
"books":{ "href": "http://myserver/author/y/books"}
}
}
}
}
本の/book/x
の表現は、ページ/book/x.page
のコンテンツになります。私たちが望む本をクライアントに見せるために必要なものがすべて揃っています。そうでない場合は、_links
o embedded resource's links
に従ってフェッチできます。つまり、Webページのようにリンクをたどります。
もちろん、1回のリクエストですべてを返すこともできます。ただし、結果を最初に重み付けする必要があります。たとえば、単一のコレクションではなくBooks
のコレクションがある場合はどうなりますか。このようなブックやページごとのロードが必要な場合、サーバーはどのように動作しますか。また、並行性が高い場合はどうなりますか?データベースはどうですか?これらの条件下でどのように動作しますか?本の表現にさらに情報を追加し続けるとどうなりますか?関連データを削除したい場合はどうなりますか? bookの表現からデータのブロックを削除したり、リンクを削除したりすると、害が少なくなりますか?
ご覧のとおり、お答えできない質問がたくさんあります。だから何をすべきかを言うのが難しいのです。それはすべてあなたのニーズ次第です。