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. ステップ・バイ・ステップ解説
- 知識の移動: 「管理者なら編集ボタンを出す」というルールをJSに教えるのではなく、サーバー側で判断して「ボタン入りのHTML」を送ります。
- 動的な導線: フロントエンドのコードは「届いたものを表示する」だけで完結します。
- 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)に迫っていきます。