コンテンツにスキップ

011. HATEOAS(Hypertext As The Engine Of Application State)

原理:Webアプリの「エンジン」はどこにある?

謎めいた言葉、HATEOASの正体

「HATEOAS(ヘイティオス)」という言葉。Webエンジニアの間でも「何だか難しそう」と敬遠されがちですが、その意味は極めてシンプルで、そして最も革命的です。 直訳すると「アプリケーションの状態を駆動するエンジンとしてのハイパーテキスト(HTML)」となります。

もっと簡単に、「レストランのメニュー」を想像してください。 あなたがレストランに入ったとき、最初から「この店のすべてのメニューとその値段(APIドキュメント)」を丸暗記してから入店する人はいないはずです。 1. まず、あなたは席に座ってメニュー(HTML)を見ます。 2. メニューには今注文できる料理が載っています。 3. あなたが「前菜」を頼むと、次のメニューが運ばれてきて「メインディッシュ」が選べるようになります。

このように、「次に何ができるか(ボタンやリンク)」が、常にサーバーから届くHTML(メニュー)の中に含まれている状態。これこそが HATEOAS です。アプリを動かす「エンジン(導線)」が、ブラウザ側のプログラムの中ではなく、サーバーから届くハイパーテキスト(HTML)の中にある、という考え方です。

迷子にならないWebアプリ

現代の多くのWeb開発(REST API + JSフレームワーク)はこの逆を行っています。 ブラウザが「次はどのURLを叩けばいいか」をあらかじめプログラムとして知っていなければなりません。これは、メニューを暗記してからレストランに入るようなもので、非常に不自然で壊れやすい仕組みです。

HTMXは、この HATEOAS というWeb本来の姿を現代に蘇らせます。サーバーから届くHTMLパーツ一つ一つに「次はこれをすればいいよ」というHTMX属性(導線)を込める。ブラウザはそれを表示し、ユーザーはそれに従う。これだけで、複雑な「遷移のロジック」をフロントエンドに書く必要がなくなるのです。


実践:サーバーが「次の一歩」を導く設計

1. 注文フローの自動導線

ユーザーが「注文ボタン」を押した後に、状況に応じて異なる選択肢を表示する例です。

<!-- 最初の注文ボタン -->
<div id="order-flow">
    <button hx-post="/api/order/step1" hx-target="#order-flow">
        注文を開始する
    </button>
</div>

【サーバーが返却するHTML(通常時)】

<div id="order-flow">
    <p>手順1:支払い方法を選んでください</p>
    <button hx-post="/api/order/pay-credit" hx-target="#order-flow">クレジットカード</button>
    <button hx-post="/api/order/pay-cash" hx-target="#order-flow">代金引換</button>
</div>

【サーバーが返却するHTML(在庫切れ時)】

<div id="order-flow">
    <p class="error">申し訳ありません、在庫がなくなりました。</p>
    <button hx-get="/menu" hx-target="body">メニューに戻る</button>
</div>

2. コンテキストに応じたアクション

ユーザーの権限や状態によって、表示されるボタン(できること)をサーバー側で変えます。

<!-- サーバーが生成する「ユーザー情報」のパーツ -->
<div class="user-card">
    <p>名前:田中太郎</p>
    {% if user.is_admin %}
        <!-- 管理者なら「編集」ボタンが届く -->
        <button hx-get="/admin/user/edit/1" hx-target="#modal">編集</button>
    {% endif %}
    <!-- 誰でも「メッセージ送信」はできる -->
    <button hx-get="/msg/new/1" hx-target="#modal">メッセージ</button>
</div>

3. ステップ・バイ・ステップ解説

  1. 知識の移動: 「管理者なら編集ボタンを出す」というルールをJSに教えるのではなく、サーバー側で判断して「ボタン入りのHTML」を送ります。
  2. 動的な導線: フロントエンドのコードは「届いたものを表示する」だけで完結します。
  3. URLの隠蔽: HTMX属性の中にURLが埋め込まれているため、フロントエンドは「次にどこのAPIを叩くか」を管理する必要がありません。

比較:JSによる「ルーティング」 vs HTMLによる「ナビゲーション」

従来の「JSフレームワーク方式」

  • ブラウザの知識: 「もしログインしていれば、editボタンを表示し、クリックされたら /users/1/edit に遷移する」という大量のルールをJSで持つ。
  • 脆さ: サーバー側でパスを /users/update/1 に変えたら、ブラウザ側のJSもすべて書き直し。
  • 肥大化: アプリが大きくなるほど、JSが持つ「ルール」が無限に増えていく。

HTMXの「HATEOAS方式」

  • ブラウザの知識: なし。届いたボタンを押すと、そこに書いてあるURLに飛ぶだけ。
  • 柔軟性: サーバー側でいくらURLやロジックを変えても、フロントエンドの修正は不要。
  • 軽量化: アプリがどれだけ巨大になっても、フロントエンドは常に「表示するだけ」の薄い状態を維持できる。

まとめ:初心者のための「レストラン型」開発

HATEOASをマスターすることは、あなたのアプリを「ルールに縛られた機械」から「流動的なサービス」へと昇華させることです。

  • ブラウザに暗記させるな: ボタンの出し分けをJSのif文で書かないようにしましょう。
  • HTMLが案内役: プログラムではなく、届いた「ボタン」という実体に、次の仕事を託してください。
  • 変化に強い設計: サーバーサイドで画面構成を変えるだけで、全世界のユーザーの画面が一瞬で更新される。この「中央集権的」な便利さを享受しましょう。

「Application Engine(エンジンのような導線)としてのハイパーテキスト(HTML)」。この神秘的な響きの言葉が、実はWeb開発の原点であり、最も楽で強力な方法であることを、HTMXは教えてくれます。次の記事では、このハイパーメディアがインターネットの回線をどのように流れていくか、その実体「HTML over the wire」(012. HTML over the wire)に迫っていきます。