頭に浮かぶのは、RESTful APIにURL自体の再帰性を反映させないことです。考えてみてください。あなたのリソースはドキュメントだけです。
ドキュメントが再帰的な構造に従って物理的に保存されている場合は、一意のIDへのマッピングを作成し、URLでそのIDを使用します。
/rest/documents/{id}
次のようなドキュメントがある場合:
| DocumentName | DocumentPath | DocumentID |
--------------------------------------------
| abc | / abc | 1 |
| asd | / abc / asd | 2 |
| asd | / asd | 3 |
| ブー / abc / asd / boo | 4 |
| ねえ| / abc / asd / hey | 5 |
リクエストは/abc/asd
ドキュメントのこのURLを調べます
GET /rest/documents/2
そのため、今度は、APIのユーザーに、少しの労力で構造をトラバースする手段を提供する必要があります。これは、次のような追加のトラバーサル情報を含むオブジェクトに応答ペイロード(ドキュメント)をラップすることで実行できます。
{
data: { /* your document goes here */ },
parent: {"abc": 1 },
children: [ { "boo": 4 }, { "hey": 5} ]
}
ユーザーが1つのレベルで多くのドキュメントを作成しないことを想定している場合は、応答に子のリストを含めることができます。そうでない場合は、子ドキュメントIDを取得するようにユーザーに提案して、たとえばクエリ文字列パラメーターを介して結果をページングできるようにすることができます。
GET /rest/documents/2/children?page=2&size=50
最後に、クエリ文字列パラメータについて言えば、クエリ文字列パラメータを介してパス情報を直接指定することもできます。
GET /rest/documents?path=somepath&page=1&size=42
前述のすべてのアプローチは、プレーンGET /rest/documents
がルートドキュメントのみを返すことを期待しています。