HATEOAS の背後にある中心的なアイデアの 1 つは、クライアントが単一のエントリ ポイント URL から開始し、公開されているすべてのリソースとそれらに利用可能な状態遷移を検出できるようにすることです。それが HTML でどのように機能するか、ブラウザの背後で人間がリンクをクリックして「送信」ボタンをクリックする様子は完全に理解できますが、この原則をどのように適用すれば (運が悪いか) 対処できなかった問題に適用できるか疑問に思っています。
私は、RESTful な設計原則が論文や教育記事で提示されているのが好きです。それはすべて理にかなっています。コーヒーを GET する方法はその良い例です。慣習に従い、単純で退屈な詳細のない例を考えてみます。郵便番号と都市を見てみましょう。
問題1
郵便番号で都市を検索するための RESTful API を設計したいとしましょう。郵便番号にネストされた「都市」と呼ばれるリソースを思いついたので、GET onhttp://api.addressbook.com/zip_codes/02125/cities
は、たとえばドーチェスターとボストンを表す 2 つのレコードを含むドキュメントを返します。
私の質問は、HATEOAS を通じてそのような URL をどのように発見できるのでしょうか? で最大 40K のすべての郵便番号のインデックスを公開することはおそらく非現実的http://api.addressbook.com/zip_codes
です。40K のアイテム インデックスを使用することは問題ではありませんが、この例は私が作成したものであり、はるかに大きな規模のコレクションが存在することを思い出してください。
したがって、基本的には、リンクではなくリンク テンプレートを公開したいと思います。これhttp://api.addressbook.com/zip_codes/{:zip_code}/cities
は、原則に反し、クライアントが所有する帯域外の知識に依存します。
問題 2
特定のフィルタリング機能を備えた都市インデックスを公開したいとしましょう。
GET on
http://api.addressbook.com/cities?name=X
は、名前が一致する都市のみを返しX
ます。GET on
http://api.addressbook.com/cities?min_population=Y
は、人口が以上の都市のみを返しY
ます。
もちろん、これら 2 つのフィルターは一緒に使用できますhttp://api.addressbook.com/cities?name=X&min_population=Y
。
ここでは、URL だけでなく、これら 2 つの可能なクエリ オプションと、それらを組み合わせることができるという事実も公開したいと思います。これは、これらのフィルターのセマンティクスとそれらを動的 URL に結合する背後にある原則についてのクライアントの帯域外知識がなければ、まったく不可能のようです。
では、HATEOAS の背後にある原則は、このような些細な API を本当に RESTful にするのにどのように役立つのでしょうか?