RESTful、hypertext-drivenシステムでは、クライアントが異なるタイプの3つ以上のリソースに依存する新しいリソースを作成できるようにする必要があります。この機能を公開する最良の方法は何ですか?REST:異なる種類の3つ以上のリソースに依存するリソースを作成する方法
たとえば、オンラインストアを実行しているとします。サーバーは約4つのリソースを知っています。
- 注文:出荷する製品のグループ。 [1つの貨物を持っています]
- 宛先:出荷先です。 [多くの貨物を持っている]
- 貨物:製品を顧客に送る行為。 [宛先、注文、およびパッカーに属します]
- パッカー:従業員が物理的に出荷の注文を準備しています。 [多くの貨物があります]
注文が出荷されると、クライアントはサーバーに新しい貨物を作成してこのイベントを記録する必要があります。出荷には、Destination、Order、およびPackerへの参照が必要です。
は、私は3つのアプローチを考えることができ、新たな出荷の作成を実現するために、私はそれらのいずれかを好きではない:出荷メディアタイプを使用して/出荷に- POSTを。出荷メディアタイプには3つのフィールドがあります: "order_uri"; "packer_uri";と "destination_uri"。各URIは、出荷に関係する注文、パッカー、および宛先の一意の識別子としてそれぞれ使用されています。
- 出荷メディアタイプを使用して、/ orders/{order_id}/packers/{packer_id}/destination/{destination_id}/shipmentにPOSTします。
- "ShipmentBuilder"という名前のシステムに新しいリソースを追加します。 ShipmentBuilderメディアタイプに含まれている "packer_uri"、 "destination_uri"、 "order_uri"を使用して/ shipipment_buildersにPOSTします。
私はオプション1が嫌いです。なぜなら、出荷メディアタイプは、注文、包装業者、および行き先へのリンクを追加定義するからです。ここで、「リンク」は、人間が読める名前、URI、およびメディアタイプからなるJSONハッシュです。メディアタイプに「order_uri」、「packer_uri」、および「destination_uri」を追加することは、関連付けられたリソースのURIを複製するため、あまりDRYに見えません。
オプション2は、深くネストされたURIを使用します。深くネストされたURIは、非常に保守的に見えず、意味のある階層情報も取得しません。
オプション3では、クライアントと出荷の作成の間に別のレベルの抽象化があり、システムの学習が困難になります。
出荷が他のリソースにのみ依存する場合、オプション2はもっと意味がありますが、この場合はありません。それが現れて、私はオプション3を好むが、より良いものを好むだろう。
この例では、新しい貨物を作成するためのURIとメディアタイプの最適な組み合わせは何ですか?考慮すべき他のアプローチは何か?
アップデート:以下は、注文、パッカー、および宛先のリンクを示す出荷リソースのJSONの例です。
{
"shipment":{
"created_at": "Wed Sep 09 18:38:31 -0700 2009",
"order_uri":"http://example.com/orders/815",
"packer_uri":"http://example.com/packers/42",
"destination_uri":"http://example.com/destinations/666"
},
"order":{
"name":"the order to which this shipment belongs",
"uri":"http://example.com/orders/815",
"media_type":"application/vnd.com.example.store.Order+json"
},
"packer":{
"name":"the person who packed this shipment",
"uri":"http://example.com/packers/42",
"media_type":"application/vnd.com.example.store.Packer+json"
},
"destination":{
"name":"the destination of this shipment",
"uri":"http://example.com/destinations/666",
"media_type":"application/vnd.com.example.store.Destination+json"
}
}
「出荷」のハッシュ(以下「のcreated_at」フィールド)の内容がPOSTさになるだろう:「出荷」のハッシュでオプション1が表示されることにより、必要なURIの重複。 GETを使用している場合、上記の完全な出荷表示が送信されます。
配送メディアタイプへのURIの追加がDRYと思われない理由を詳しく説明できますか?私はあなたが何を参照している重複を理解していない。 –
Darrelは、下部に何かを追加しました。 –