@VoicesOfUnreason が言ったように、HATEOAS では URI は発見可能 (文書化されていない) であるため、変更することができます。つまり、それらがシステムへのまさにエントリ ポイント ( Cool URI、クライアントによってハードコードできる唯一のもの) でない限り、残りの部分を進化させる機能が必要な場合は、それらをあまり多く持つべきではありません。将来のシステムの URI 構造。実際、これはRESTの最も便利な機能の 1 つです。
残りの非 Cool URI については、時間の経過とともに変更される可能性があり、API ドキュメントでは、ハイパーメディア トラバーサルを通じて実行時に検出される必要があるという事実を詳しく説明する必要があります。
リチャードソンの成熟度モデル (レベル 3)を見ると、ここでリンクが機能します。たとえば、/api/version(/1) などの最上位から、グループへのリンクがあることがわかります。HAL Browserのようなツールでこれがどのように見えるかを次に示します。
根:
{
"_links": {
"self": {
"href": "/api/root"
},
"api:group-add": {
"href": "http://apiname:port/api/group"
},
"api:group-search": {
"href": "http://apiname:port/api/group?pageNumber={pageNumber}&pageSize={pageSize}&sort={sort}"
},
"api:group-by-id": {
"href": "http://apiname:port/api/group/id" (OR "href": "http://apiname:port/api/group?id={id}")
}
}
}
追加は単にそのエンドポイントへの POST であり、2 つの GET メソッドが必要になります。
GET /api/group?pageNumber=0&pageSize=20&sort=asc
これは次のようなものを返す可能性があります:
{
"groups": [
{
"id": 123,
"name": "Test Group"
},
{
"id": 134,
"name": "Tennis squad"
}
]
}
次に、特定のグループ (#123 など) にドリルダウンすると、次のようになります。
{
"Id" : 123,
"Name" : "test",
"_links": {
"self": {
"href": "/api/group/1" (OR "/api/group?id=1")
},
"edit": {
"href": "http://apiname:port/api/group/1"
},
"api:delete": {
"href": "http://apiname:port/api/group/1"
},
"api:items-query": {
"href": "http://apiname:port/api/bonus?groupId=1"
}
}
}
ここでは、編集は単に PUT であり、次に DELETE が必要になります (同じリンクの REST のレベル 2 を参照してください)。項目については、それらが単なるプロパティであるか、別のエンドポイントであるかを最もよく知っているでしょう。グループを取得しているのと同じ呼び出しで返されるようにそれらを埋め込むこともできます。
ここでの利点は、クライアントがリレーションシップ (リンク) の名前 (リソース構造/プロパティ以外に明らかに) を知る必要があるだけであるのに対して、サーバーはリレーションシップ (およびリソース) の URL をほとんど自由に変更できることです。