web-dev-qa-db-ja.com

RESTful APIの関係

AuthorBookの2つのリソースを使用してAPIを作成しているとします。

したがって、REST apiを次のように設計します。

/books
/books/:id
/books/:id/authors
/authors
/authors/:id
/authors/:id/books

たとえば、/books/:idは、指定されたBookおよびさまざまなidsを使用してAuthorを返す必要がありますか?または、与えられたBookとさまざまなidsのidsを持つAuthorを返す必要があります。これらは、/authors/:idへの一連のクエリを介してクエリできます。または/authors?ids=1,2,3など

2
Adam Thompson

APIエンドポイントの代わりに、これらがWebサイト上のWebページである場合、どのように配置しますか?

あなたが間違っていると思った場合、またはさらに悪いことに、どうにかしてそれを複数の方法で行わなければならなかった場合、どうしますか?

ほとんどの場合、答えは次のとおりです。より多くのドキュメントを作成し、人々が自分に最適なドキュメントを確実に見つけられるようにリンクを追加します。

考えてみてください。インターネット上にはいくつのHemingway Webページがありますか?

Webはドメインではなく、ドキュメント管理システムです。すべてのHTTP動詞は、ドキュメント管理ドメインに適用されます。 URIはドメインオブジェクトにマップされません-これはカプセル化に違反しています。作業(例:ドメインモデルへのコマンドの発行)は、リソース管理の副作用です。つまり、リソースは腐敗防止層の一部です。統合ドメインには、ビジネスドメインでビジネスオブジェクトを実行するよりもはるかに多くのリソースが必要です。 - ジムウェバー2011

REST APIは、ドメインモデルをWebサイトに偽装する試みです。Webをガイドにしてください。

7
VoiceOfUnreason

たとえば、/ 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の表現からデータのブロックを削除したり、リンクを削除したりすると、害が少なくなりますか?

ご覧のとおり、お答えできない質問がたくさんあります。だから何をすべきかを言うのが難しいのです。それはすべてあなたのニーズ次第です。

4
Laiv