2016-10-04 1 views
3

私はREST APIを構築しています。私はリンクを非常に長くしている関係があります。彼らは私には意味をなさないが、それは混乱している。私はこれを処理する最善の方法が何であるか分かりません。長い間リンクしているのは問題ですか?私はこれらの原則に違反していますか?このような関係をどのように扱うべきですか?REST APIで非常に深い関係を扱う

以下の例は少し工夫されていますが、私が何をしようとしているかを示しています。

会社は、部が多く、である。各には、の従業員が多数あります。各従業員は、多くの場合、台のコンピュータを持つことができます。各のコンピュータは、の文書を多数持つことができます。

GETへのパスは、特定の文書は次のようになります

/companies/:companyId/departments/:departmentId/employees/:employeeId/computers/:computerId/documents/:documentId 

を各IDは、その層内でグローバルに一意である - どの2つの文書IDは、システム全体にわたって同じしないであろうが、ドキュメントIDがあってもよいです従業員IDと同じです。

これは私にとっては理にかなっています。なぜなら、各レイヤーはその上の1つのものにしか関連付けられていないからです。部門は、単一の会社、単一の部署のみの従業員、単一の従業員のみのコンピュータ、および1台のコンピュータへの文書にのみ所属します。

/computersのような別個のエンドポイントにこれらを分割することができますが、どのようにそれらを壊すべきか分かりますか?なぜ/computersをエンドポイントとして選択し、/employees/:employeeId/computersを選択しないのですか?

+0

** documentId **はグローバルに一意ですか? – JonSG

+0

@JonSGはい、すべてのドキュメントID内で一意です。私は明確にするために質問を編集しました。 – vaindil

+2

私の意見はこちらですが、APIの階層構造を表現する必要はありません。あなたが例示したものの、他にも多くのものがあります。私はあなたのapiを**/document/[id] **に簡略化する必要があるように感じます。同様に、employeeidがグローバルに一意の場合は、** employee/[id] **となります。 Idと知られているファイルの内容を知りたい場合、なぜ消費者に従業員や部門について知らせるのですか?一方、最初の投稿/ putは、階層が必要となる可能性があるため、別の問題です。 「完全な」動詞セットをサポートする必要がありますか、それとも十分ですか? – JonSG

答えて

2

この例では、これらのリソースのそれぞれをトップレベルに移動します。各トップレベルのリソースは、メンバーとして次の「レベル」を持つことができます。したがって、実際にエンドユーザーがコレクションの内容を操作する必要がある場合は、サブリソースのみを追加します。

深くネストされたリソースには問題があります。企業{id}のために働いている部門に関係なく、すべての従業員を見つけるためのビジネス要件が得られたら、3ヶ月後に何が起こりますか?従業員をトップレベルのリソースとして使用して、GET /employees?companyId={id}のサポートを追加します。上記のデザインでは、あなたの選択はすべて悪いです。あなたが持っているような入れ子構造を正式化するときに諦めるリソース間の関係には、多くの柔軟性があります。

は限り、あなたの特定の問題のいくつかのように:私はREST APIを構築しています

RESTは、URIの設計の主題に完全に依存しません。

私はリンクを非常に長くしている関係があります。彼らは私には意味をなさないが、それは混乱している。 [..]それほど長いリンクを持つのは問題ですか?

エンドユーザーは、うまくいけば、これらを入力することはありません。あなたのAPIが本当にRESTfulなであれば、クライアントはあなたが戻っているリンクを使用すると、彼らはどちらかでそれらを入力する必要はありません。 RESTfulなシステムでは、私はあなたのURIの形で文書化されているだけでなく、リンクに "私はいくつかのXの関係がある"ことを期待しています。私は彼らが長い側にいることに同意し、上記の理由でそれらを変更するだろうが、私はあなたの特定の懸念がそれらを変更する正当な理由だとは思わない。

私はこれらの原則に違反していますか?

私は認識していません。

+0

RESTはURIにとらわれず、いわゆるclean-URIデザインに重点を置いていることに完全に同意します。しかし、すべてのサブリソースをトップレベルのリソースに変更することはありません。私の個人的な好みは、自分たちで "生き残る"ことができれば、リソースをトップレベルのリソースに変換することです。部門は企業に密接に結びついていますが、従業員は会社なしではまだ生きていますが、従業員ではないため、従業員として残しています。一方、コンピュータは会社にかかわらずコンピュータのままであり、したがってトップレベルのリソースに適しています。 –

+0

@RomanVottnerこの例では、部門はサブリソースとしてしかないでしょうか?タイトなカップリングが永遠に続くことを保証できるなら、私はそのアプローチに同意しません。ビジネス・ルールが変更されても、... –

+0

従業員も会社に結合されているため、従業員ではありません。従業員が会社を辞め、生命にかかわることが何も起こらない場合、彼女はまだその会社の従業員ではなく生きています。ビジネスルールが変更されたり、部門がマージ/分割されたりしても、真のRESTfulクライアントは以前の回答から単純に学ぶので、中断しません。 URI関連の質問は常に意見の回答の傾向がありますが、SOコミュニティはそのような質問を閉じることに非常に熱心ではありません。 –

関連する問題