オブジェクト グラフを作成するための RESTful API を設計する方法に頭を悩ませようとしています。たとえば、リソースが次の関係を持つ eCommerce API について考えてみます。
オーダー(メインオブジェクト)
- 多数のアドレス
- Has-many Order Line items (注文の構成要素)
- 多額の支払い
- 連絡先情報が多い
Order リソースは、通常、その関連付けとともに意味があります。単独では、ビジネス上の重要性を持たない単なるコンテナです。ただし、関連付けられた各オブジェクトには独自の寿命があり、独立して操作する必要がある場合があります。注文の配送先住所の編集、注文に対する連絡先情報の変更、発注後の注文からの項目の削除など。
API の設計には 2 つのオプションがあります。
- Order API エンドポイントは、送信されたコンテンツ内の「ネストされたリソース」を処理することにより、自身とそれに関連付けられたリソースをインテリジェントに作成します。
POST /orders
- Order リソースはそれ自体を作成するだけであり、クライアントは、 など
POST /orders/123/addresses
の新しく作成されたエンドポイントに対してフォローアップの POST リクエストを行う必要があります。PUT /orders/123/line-items/987
2 番目のオプションはサーバー側での実装がより簡単ですが、ユースケースの 80% でクライアントが余分な作業を行う必要があります。
最初のオプションには、次の未解決の問題があります。
- 新しく作成されたリソースの URL をどのように伝えるのでしょうか? ヘッダーは 1 つの
Location
URL しか通信できませんが、サーバーは複数のリソースを作成する可能性があります。 - エラーにどのように対処しますか?アソシエーションの 1 つにエラーがある場合はどうなりますか? オブジェクトグラフ全体を拒否しますか? そのエラーはどのようにクライアントに伝えられますか?
これに対処するRESTful +実用的な方法は何ですか?