この質問は言語に依存しません。フレームワークや実装について心配する必要はありません。すべてを実装できるとだけ言って、REST API を抽象的に見てみましょう。言い換えれば、私は現在フレームワークを構築していますが、この問題の解決策はどこにもありませんでした。
質問
コレクションを返す 2 つの独立した REST パスが交差する REST URL エンドポイントを構築するにはどうすればよいでしょうか? /users/1/comments
簡単な例:とを交差させる方法は/companies/6/comments
?
制約
すべてのエンドポイントは、単一のデータ モデル エンティティまたはエンティティのコレクションを返す必要があります。
これは非常に合理的な制約であり、ハイパーメディア API のすべての例は、draft-kelly-json-hal-07であってもこのようになります。
これが無効な制約であると思われる場合、またはより良い方法を知っている場合は、お知らせください。
例
と の 3 つのデータ型を持つアプリケーションがあるproducts
とcategories
しcompanies
ます。各企業は、プロファイル ページにいくつかの製品を追加できます。製品を追加する際、製品にカテゴリを添付する必要があります。たとえば、この種のデータには次のようにアクセスできます。
GET /categories
すべてのカテゴリのコレクションを返しますGET /categories/9
ID 9 のカテゴリを返しますGET /categories/9/products
ID 9 のカテゴリ内のすべての製品を返しますGET /companies/7/products
ID 7 の会社のプロファイル ページに追加されたすべての製品を返します。
_links
ハイパーメディアの部分は簡単なので、意図的に/
省略_links
しまし/categories
た/companies
。
返される URL の書き方: 会社 (7) のすべての製品とカテゴリ (9) の製品は? 言い換えれば、どのように交差する/categories/9/products
の/companies/7/products
ですか?
すべてのエンドポイントがデータ モデル リソースまたはそれらのコレクションを表す必要があると仮定すると、これは REST ハイパーメディア API の根本的な問題であると考えられます。 2 つの独立したグラフ パスの断面。
つまり、1 つのパスだけで 2 つの独立したパスを表すことはできないと思います。通常は のような 1 つのパスをトラバースしますA->B->C
がX->Y
、 and があり、そこから来るZ->Y
すべての が必要な場合、問題が発生します。Y
X
Z
これまでのところ、私の提案はクエリ文字列を使用する/categories/9/products?intersect=/companies/9
ことですが、もっとうまくやれるでしょうか?
なぜ私はこれが欲しいのですか?
SQL データベースの関係に基づいて REST ハイパーメディア API を自動生成するフレームワークを構築しているためです。URL からクエリへのトランス コンパイラと考えることができますSELECT ... JOIN ... WHERE
が、API のクライアントは Hypermedia しか認識せず、クライアントは例のように交差を行う適切な方法を望んでいます。