2013-11-15 15 views
12

RESTful APIの一般的なパターンは、埋め込みリンクを持つ単一のオブジェクトを返すことです。関連オブジェクトを取り出すために使用できます。しかし、時には便利のために、オブジェクトグラフ全体を一度に取り戻したい場合もあります。RESTful APIへの組み込み/埋め込みvs.リンク

たとえば、あなたが顧客受注、および戻りとストアアプリケーションを持っているとしましょう。顧客ID 12345の個人情報、すべての注文、およびすべての返品を一緒に表示したいとします。には常にが返されます。

純粋にRESTfulな方法

  1. GET /
    • は顧客
  2. を照会するものを含め、リンクテンプレートのリストを返します。これを行うには、何かに似ています210
  3. GET /customers/12345/からリンクテンプレートに基づいて)
    • 戻り、顧客の個人情報
    • リターンリンクこの顧客の注文を取得すると(/customers/12345応答から)
  4. GET /orders?customerId=12345を返し
    • が受注を獲得顧客向け12345
  5. GET /returns?customerId=12345/customers/12345応答から)
    • が顧客12345

のためのリターンを取得します。しかし、あなたがcustomers URIを持っていたら、それはすべてのバック1つのクエリでこれを引っ張ることができるように、素敵なことです。このような便利なクエリのベストプラクティスはありますか?複数のリクエストを行うのではなく、リンクの一部またはすべてを継承したいのですか?私は次のようなものを考えています:

GET /customers/12345?include=orders,returns 

しかし、もし人々がこれをやっているのであれば、私はむしろ何かを作っていません。

(FWIW、私は店を構築していないよ、それでは、これらのモデル、またはどのように実際の製品、または任意にドリルダウンしようとしているために右のオブジェクトであるかどうかについては屁理屈ないようにしましょう。)

それは HAL speakにこれらが「埋め込まれたリソース」と呼ばれるように見えますが、示された例では、埋め込むためにどのリソースを選択するにはどのような方法があるように思えません:。追記

私はクエリパラメータとしてembedを使用して、私が上記のどのようなことを示唆one blog postが見つかりました:

GET /ticket/12?embed=customer.name,assigned_user 

これは、標準または半標準的な慣行、または1人のブロガーが作らだけで何かですか?

答えて

1

これらのタイプのパラメータのセマンティクスは、それらをサポートするリンク関係ごとに文書化する必要があり、これはコード化する必要がありますか、私には分かりませんこれを表現する標準的な方法を持つことによって得られるものURL構造は、特定の標準やベストプラクティスではなく、サーバーが返す最も簡単で最も慎重なものによって駆動される可能性が高くなります。

あなたはインスピレーションを求めているなら、ODataが何をしているのかを$expand parameterで確認し、そのリンク関係をモデル化することができます。あなたの関係の契約を明確に定義する必要があることに留意してください。それ以外の場合、クライアントプログラマーはODataのような規約を参照して、アプリケーションが完全にODataに準拠していると誤って判断します。

+1

指定した$ expandパラメータのリンクが壊れています。 –

+1

壊れたリンクは、[このページ](http://www.odata.org/blog/enhancing-odata-support-for-querying-derived-types-revisited/)の$ expandセクションを参照してください。 – Leith

+0

ありがとう、Leith!一定。 –

関連する問題