1

HATEOAS は、その時点でアプリケーション内で実行できるすべてのアクションを応答 (HAL、JSON-LD など) として送信することで、アプリケーションの状態を表すことを理解しています。

たとえば、銀行の口座リソースを表示すると、口座の入金、引き出し、または閉鎖が可能になる場合があります (OPTIONS は UPDATE および DELETE 動詞を返す場合があります)。

これらのリンクを (消費するクライアントが) 実行時に検出できるという点では、どうすればよいでしょうか?

これらのリンクを送信する目的が、クライアントをサーバーから分離し、応答のハイパーメディアによって状態を駆動することである場合、開発者は、応答が意味をなすためにアプリケーションにハードコーディングする必要がある量の知識が必要です。戻ってきた。

OPTIONS リクエストを送信することが、リソースの現在の状態と次にできることを判断する方法であることは理解していますが、使用する実際の URI を見つけるために、これらは単純に COOL URI としてハードコーディングされますか?

4

2 に答える 2

2

@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 をほとんど自由に変更できることです。

于 2016-09-13T07:06:14.843 に答える