REST 複合/複合/ネストされたリソース [closed] 質問する

REST 複合/複合/ネストされたリソース [closed] 質問する

REST ベースの API の概念に対処する最善の方法を考えています。他のリソースを含まないフラットなリソースは問題ありません。問題が発生するのは、複雑なリソースです。

たとえば、漫画本のリソースがあります。には、、、などのComicBookさまざまなプロパティがあります。authorissue numberdate

漫画本には1..n表紙のリストもあります。これらの表紙は複雑なオブジェクトです。表紙には、アーティスト、日付、さらには表紙の Base 64 エンコードされた画像など、表紙に関する多くの情報が含まれています。

1 つのGET場合、ComicBookコミックと、base64 イメージを含むすべてのカバーを返すだけで済みます。1 つのコミックを取得するだけなら、それほど大きな問題ではないでしょう。しかし、システム内のすべてのコミックをテーブルに一覧表示するクライアント アプリを構築しているとします。
テーブルにはComicBookリソースのいくつかのプロパティが含まれますが、すべてのカバーをテーブルに表示することは絶対に望ましくありません。複数のカバーを持つ 1000 冊のコミックを返すと、途方もなく大量のデータがネットワーク経由で送信されることになりますが、その場合、エンド ユーザーには必要ないデータです。

私の直感ではCover、リソースを作成してComicBookカバーを含めるようにしています。つまり、CoverURI です。GETコミック ブックでは、巨大なCoverリソースの代わりに、各カバーの URI を返し、クライアントは必要に応じてカバー リソースを取得できます。

今、新しいコミックを作成するときに問題があります。 を作成するときは、少なくとも 1 つのカバーを作成したいと思うでしょうComic。実際、それはおそらくビジネス ルールです。
そのため、私は行き詰まっています。まず を送信してCoverそのカバーの URI を取得し、次にリスト内のその URI を使用してPOSTを実行することで、クライアントにビジネス ルールを強制するか、または、が吐き出すものとは異なるリソースを受け取ります。 と の受信リソースはディープ コピーであり、送信 には依存リソースへの参照が含まれます。ComicBookPOSTComicBookPOSTGETGET

いずれにしても、リソースCoverはおそらく必要でしょう。なぜなら、クライアントとして、場合によってはカバーの方向性に対処したいと考えるからです。したがって、依存リソースのサイズに関係なく、問題は一般的な形で存在します。一般に、クライアントにリソースの構成方法を「知る」ことを強制せずに、複雑なリソースを処理するにはどうすればよいでしょうか。

ベストアンサー1

@ray、素晴らしい議論ですね

@jgerman、REST だからといって、リソースを POST から固定しなければならないわけではないことを忘れないでください。

リソースの特定の表現に何を含めるかは、あなた次第です。

カバーを個別に参照するケースは、親リソース (コミック ブック) を作成し、その子リソース (カバー) を相互参照するだけです。たとえば、著者、出版社、キャラクター、またはカテゴリへの参照を個別に提供することもできます。これらのリソースを個別に作成するか、子リソースとして参照するコミック ブックの前に作成することをお勧めします。または、親リソースの作成時に新しい子リソースを作成することもできます。

カバーの具体的なケースは、カバーには実際にコミック本が必要であり、その逆もまた同様であるという点で、少し複雑です。

ただし、電子メール メッセージをリソース、送信元アドレスを子リソースと見なすと、送信元アドレスを個別に参照できることは明らかです。たとえば、すべての送信元アドレスを取得します。または、以前の送信元アドレスを使用して新しいメッセージを作成します。電子メールが REST であれば、/received-messages、/draft-messages、/from-addresses、/to-addresses、/addresses、/subjects、/attachments、/folders、/tags、/categories、/labels など、多くの相互参照リソースが利用可能になることが容易にわかります。

このチュートリアルでは、相互参照されたリソースの優れた例を示します。http://www.peej.co.uk/articles/restfully-delicious.html

これは、自動生成されたデータの最も一般的なパターンです。たとえば、新しいリソースの URI、ID、または作成日はサーバーによって生成されるため、投稿する必要はありません。ただし、新しいリソースが返されたときに、URI、ID、または作成日を取得できます。

バイナリ データの場合の例。たとえば、バイナリ データを子リソースとして投稿するとします。親リソースを取得すると、それらの子リソースを同じバイナリ データとして、またはバイナリ データを表す URI として表すことができます。

フォームとパラメータは、リソースの HTML 表現とは既に異なります。URL となるバイナリ/ファイル パラメータを投稿することは、難しいことではありません。

新しいリソースのフォーム (/comic-books/new) を取得する場合、またはリソースを編集するためのフォーム (/comic-books/0/edit) を取得する場合は、リソースのフォーム固有の表現を要求しています。コンテンツ タイプ "application/x-www-form-urlencoded" または "multipart/form-data" でリソース コレクションに投稿すると、そのタイプの表現を保存するようにサーバーに要求しています。サーバーは、保存された HTML 表現などで応答できます。

API などの目的で、HTML、XML、または JSON 表現をリソース コレクションに投稿できるようにすることもできます。

コミック本の後に投稿される表紙を考慮し、コミック本に表紙があることを条件として、リソースとワークフローを説明したとおりに表現することも可能です。例は次のとおりです。

  • 遅延カバー作成が可能
  • 必要な表紙付きのコミックブックの作成が可能
  • カバーの相互参照が可能
  • 複数のカバーが可能
  • 漫画本の原稿を作成する
  • 漫画本の表紙の下書きを作成する
  • 漫画本の原稿を公開する

GET /comic-books
=> 200 OK、すべてのコミックブックを取得します。

GET /comic-books/0
=> 200 OK、表紙 (/covers/1、/covers/2) 付きのコミックブック (id: 0) を取得します。

GET /comic-books/0/covers
=> 200 OK、コミックブック (id: 0) のカバーを取得します。

GET /covers
=> 200 OK、すべてのカバーを取得します。

GET /covers/1
=> 200 OK、コミックブック (/comic-books/0) のカバー (id: 1) を取得します。

GET /comic-books/new
=> 200 OK、コミックブックを作成するためのフォームを取得します (フォーム: POST /draft-comic-books)。

POST /draft-comic-books
title=foo
author=boo
published
=2011-01-01
=> 302 見つかりました。場所: /draft-comic-books/3、表紙付きのドラフト コミック ブック (id: 3) にリダイレクトします (バイナリ)。

GET /draft-comic-books/3
=> 200 OK、表紙付きのドラフトコミックブック (id: 3) を取得します。

GET /draft-comic-books/3/covers
=> 200 OK、ドラフトコミックブック (/draft-comic-book/3) のカバーを取得します。

GET /draft-comic-books/3/covers/new
=> 200 OK、ドラフトコミックブック (/draft-comic-book/3) のカバーを作成するためのフォームを取得します (フォーム: POST /draft-comic-books/3/covers)。

POST /draft-comic-books/3/covers
cover_type=front
cover_data=(binary)
=> 302 見つかりました。場所: /draft-comic-books/3/covers、ドラフト コミック ブックの新しいカバー (/draft-comic-book/3/covers/1) にリダイレクトします。

GET /draft-comic-books/3/publish
=> 200 OK、ドラフトコミックブック(ID: 3)を公開するためのフォームを取得します(フォーム: POST /published-comic-books)。

POST /published-comic-books
title=foo
author=boo
published
=2011-01-01
cover_type=front
cover_data=(binary)
=> 302 見つかりました。場所: /comic-books/3、カバー付きの公開済みコミックブック (id: 3) にリダイレクトします。

おすすめ記事