@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) を取得するときは、リソースのフォーム固有の表現を求めています。content-type "application/x-www-form-urlencoded" または "multipart/form-data" でリソース コレクションに投稿すると、サーバーにそのタイプ表現を保存するように求められます。サーバーは、保存された HTML 表現などで応答できます。
API などの目的で、HTML、XML、または JSON 表現をリソース コレクションに投稿できるようにすることもできます。
コミックの後に投稿された表紙を考慮して、リソースとワークフローを説明どおりに表現することもできますが、コミックには表紙が必要です。以下に例を示します。
- 遅延カバー作成を許可
- 必要な表紙のコミックブックの作成が可能
- 表紙の相互参照を許可します
- 複数のカバーを許可
- コミック原案作成
- コミック カバーのドラフトを作成する
- 漫画の原案を出版
GET /comic-books
=> 200 OK、すべてのコミックを取得します。
GET /comic-books/0
=> 200 OK, コミック (id: 0) を表紙 (/covers/1, /covers/2) で取得します。
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
publisher=goo
published=2011-01-01
=> 302 Found, Location: /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) (form: POST /draft-comic-books/3/カバー)。
POST /draft-comic-books/3/covers
cover_type=front
cover_data=(binary)
=> 302 Found, Location: /draft-comic-books/3/covers, ドラフト漫画の新しい表紙にリダイレクト (/draft-comic -book/3/covers/1)。
GET /draft-comic-books/3/publish
=> 200 OK, 下書き漫画を公開するためのフォームを取得 (id: 3) (form: POST /published-comic-books).
POST /published-comic-books
title=foo
author=boo
publisher=goo
published=2011-01-01
cover_type=front
cover_data=(binary)
=> 302 Found, Location: /comic-books/3, 出版された漫画本にリダイレクト(id: 3) カバー付き。