WTFはhateoasか?


アプリケーション状態のエンジンとしてのHypermediaまたはHateoasはRESTアーキテクチャの主要な部分です.残りの主要な基礎の一つであるユニフォームインターフェイスを提供します.ここで私はそれを説明し、なぜそれが作成されます.

前の投稿 パーフェクトワールド



ユーザ実体を管理するためにAPIを公開する必要があるシステムを持っているとしましょう.APIは先月のユーザ課金のレポートをサポートするのに加えて、CRUD操作を行います.
  • すべてのユーザーを得てください:GET https://ahmedabdulaziz.com/users/
  • 1のIDを持つシングルユーザーを得る
  • 新しいユーザーを作成します:GET https://ahmedabdulaziz.com/users/1/(または、後遺症のために、後のポストのそれに関してより多くをされます)
  • ユーザーを更新します:POST https://ahmedabdulaziz.com/users/
  • ユーザーを削除:PUT https://ahmedabdulaziz.com/users/1/
  • ユーザの課金レポートを取得します.
  • Now in a perfect world these endpoints are and will always be the go-to endpoints to manage a user, we will never need to do a new change here, or will we?


    不完全な世界


    現実的に、どんな大きなプロジェクトのためにも、バックエンドの終点は時間とともに変化するでしょう.私たちの例のために、新しい建築家は雇われました、そして、彼は資源(例えば、例ではユーザー)がURIで複数形であると思っていないので、DELETE https://ahmedabdulaziz.com/users/1/の代わりに、我々は、税関報告を生成するために新しい機能を要求しているということに加えて、GET https://ahmedabdulaziz.com/users/1/reportを持っています.それで、我々は以下の終点を持ちます
  • すべてのユーザーを得てください:/users/1/を得てください
  • ID 1のシングルユーザーを取得します.
  • ユーザーを更新します.
  • ユーザを削除します:削除/user/1/
  • ユーザのデフォルトの課金レポートを取得します.
  • ユーザーのために税報告を得てください:https://ahmedabdulaziz.com/user/を得てください
  • フロントエンド部分については、フロントエンドとのコーディネート配置なしでこのアップデートをロールバックすると、これは壊滅的になります.
    これは、サーバーとクライアントの両方の独立性の進化であるRESTエンドポイントの利益を享受していないことを意味します.

    救助のための



    Now HATEOAS was introduced to specifically mitigate this issue, the issue of ever-evolving backend APIs.


    Hateoasを使用すると、実際には簡単にすべてのこれらの異なるAPIを変更しながらフロントエンドを実行し続けることができます.
    HiEeoasは、任意のエンティティの応答でアクションとそのエンドポイントを定義することによって動作します.したがって、フロントエンドのすべてのAPIをハードコード化しません.
    これは、我々の行動を実行するために応答から必要なリンクを得ることができるように、エンティティへのリンクを持つアクションのリストを追加することによって適用されます.
    もともと、https://ahmedabdulaziz.com/user/1/に対する応答は、ユーザのリストを取得するために、このようになります( HiOEOASを使ってバックエンドにシングルユーザを持っていると仮定してください).
    [
      {
        "id": 1,
        "name": "Ahmed Abdul-Aziz",
        "email": "[email protected]",
        "links": {
          "self": {
            "href": "https://ahmedabdulaziz.com/users/1"
          },
          "update": {
            "href": "https://ahmedabdulaziz.com/users/1"
          },
          "delete": {
            "href": "https://ahmedabdulaziz.com/users/1"
          },
          "report": {
            "href": "https://ahmedabdulaziz.com/users/1/report"
          }
        }
      }
    ]
    
    
    https://ahmedabdulaziz.com/user/1/からhttps://ahmedabdulaziz.com/user/1/までのエンドポイントを変更することができます.
    [
      {
        "id": 1,
        "name": "Ahmed Abdulaziz",
        "email": "[email protected]",
        "links": {
          "self": {
            "href": "https://ahmedabdulaziz.com/user/1"
          },
          "update": {
            "href": "https://ahmedabdulaziz.com/user/1"
          },
          "delete": {
            "href": "https://ahmedabdulaziz.com/user/1"
          },
          "report": {
            "href": "https://ahmedabdulaziz.com/user/1/report/default"
          },
          "tax-report": {
            "href": "https://ahmedabdulaziz.com/user/1/report/tax"
          }
        }
      }
    ]
    
    
    別のステップでは、リンクを使用するHTTPメソッドを追加して結合をさらに削減します.
    {
      "self": {
        "href": "https://ahmedabdulaziz.com/users/1",
        "method": "GET"
      }
    }
    
    これは例えばパッチを更新するためにPUTを変更します.それにもかかわらず、これはHieoas準拠ではありません.
    これを行うための推奨される方法は、https://ahmedabdulaziz.com/user/1/report/defaultだけがアクションにある古い構造を維持し、要求されたHTTPメソッドを取得するリクエストを送る前にhttps://ahmedabdulaziz.com/user/1/report/taxリクエストを送信することです.事実として、Roy T .フィールディングは、残り242479152の作成者.
    いくつかの建築家は、Hateeoasが静止のための統一的なインターフェースを持つことの一部であるので、Hateoasの役割がURIを切り離すために標準に従うことであるのを見るので、HTTPメソッドを結合しておくのを好みます.それで、HTTP動詞を認識するAPIドキュメントに戻らなければなりません.

    Remember that HATEOAS is not a replacement for something like OpenAPI for API documentation.


    また、動詞はそれがしている行動を提示しなければなりません、私がユーザーを検索しているならば、私は常に私がURIを変えるかどうかを得るでしょう.あなたはのようなインターネット上で衝突意見の多くを見つけることができます