再帰的なリソースに最適なRESTful URL構造は何ですか?


10

ツリーのようなリソース構造用のRESTfullサービスを作成していて、最適なURL構造は何だろうと思っていましたか?

私には3つの要件があります。

  1. ルートリソースのコレクションを取得できる
  2. 個別のリソースを取得できる
  3. 子リソースのコレクションを取得できる

私の現在の考えは:

/rest/documents
/rest/documents/{id}
/rest/documents/{id}/documents

単数/複数のルートを使用してリストまたは個々の要素を示すことも考えていましたが、単数と同じ複数のリソースを使用することになるので、これに対して決定しました。

上記について何か考えはありますか?またはこれを構造化する別の/より良い方法がありますか?


私は質問を誤解しているかもしれませんが、URLについて話しているとき、SEOは問題ですか?
ジョンホプキンス

SEOは問題ではありません。基本的に、自己参照リソースに最適な論理URL構造を求めています。
Matt Brailsford

それは私にはかなり簡単に思えます。
Tim Post

その構造はどのくらい深くできますか?
Martijn Verburg、2010

@Martijn深さは制限されていません
Matt Brailsford

回答:


11

頭に浮かぶのは、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がルートドキュメントのみを返すことを期待しています。


1
良いアイデア。ただし、子ドキュメントがドキュメントの応答に含まれている場合、子ドキュメントとの関係はAPIから明確ではありません。ドキュメントにコメントなどの別のサブリソースもある場合、通常は/ documents / {id} / questionsを使用してドキュメントの質問にアクセスします。一貫性を保ち、APIで子ドキュメントとの関係を明確にするために、/ documents / {id} / child-documentsで子ドキュメントにアクセスすることをお勧めします。返される表現は、/ documents / {id}と同様にDocumentsです。したがって、ここで説明した残りの部分も引き続き機能します。
ネイサンワード

2

このような何か:

/rest/{rootEntity}/Item/{leafEntity}/{id}
/rest/{entity}/ItemList
/rest/{entity}/ItemList/{leafEntity}

ここで、{rootEntity}はコレクションの開始点、{leafEntity}はツリー内の名前付きリーフノードです。

上記のいくつかのパラメータを追加して、たとえば「最新」または「すべて」などを選択できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.