コンテンツにスキップ

052. hx-request Header(HTMXからの「身分証明書」)

原理:「私はHTMXです」という公式の印

サーバーは誰と話しているのか?

Webサーバーにリクエストが届いたとき、サーバーにとってそれは「誰からの依頼か」が非常に重要です。 - 通常のブラウザ(ページ全体を欲しがっている) - スマホアプリ(JSONデータを欲しがっている) - HTMX(HTMLの断片だけを欲しがっている)

サーバーが送り主を正しく聞き分けられないと、HTMXに対して「ページ全体の巨大なHTML」を返してしまい、画面が崩れたり動きが重くなったりしてしまいます。

これを防ぐための「身分証明書」が hx-request: true というヘッダーです。HTMXが行うすべての通信には、この印が自動的に刻印されています。


実践:サーバー側での「賢い分岐」

1. サーバーサイドでの条件分岐(疑似コード)

サーバーのプログラムの中で、このヘッダーがあるかないかをチェックして、返す中身を切り替えるのが王道の使い方です。

# Flask (Python) の例
def my_view():
    # ヘッダーに 'hx-request' が含まれているかチェック
    if request.headers.get('hx-request'):
        # HTMXからの依頼なので、一部分だけのHTMLを返す
        return render_template('partial_item.html')
    else:
        # 普通のアクセス(URL直接入力など)なので、ページ全体を返す
        return render_template('full_page.html')

2. なぜこの分岐が必要なのか?

ユーザーが「お気に入りボタン(HTMX)」を押した時は、ボタンの見た目だけを返せばOKです。しかし、ユーザーがそのボタンの遷移先のURLを「直接ブラウザに打ち込んだ」時は、ヘッダーが付いていないため、サーバーは「あ、これは全画面が必要なんだな」と判断して、ヘッダーやメニューを含めた完全なページを表示できます。 これにより、「一つのURLで、部分更新と全画面表示の両方に対応できる」という、Webの理想的な形が実現します。


比較:通常のブラウザ通信 vs HTMXの通信

通常のブラウザ通信

  • ヘッダー: hx-request は存在しません。
  • サーバーの反応: 「はい、全部入り豪華版(フルHTML)をどうぞ!」

HTMXの通信

  • ヘッダー: hx-request: true が必ず付いています。
  • サーバーの反応: 「はい、必要な部品(部分的HTML)だけをどうぞ!」

まとめ:初心者のための「阿吽の呼吸」

hx-request ヘッダーは、HTMXという仕組みを支える「最も重要で、最も目立たない」基盤です。

  • 自動で付くから安心: あなたが属性に何かを書く必要はありません。HTMXが勝手にやってくれます。
  • サーバーへの「合図」として使う: これを使いこなすだけで、あなたのサーバーサイドコードは「HTMX専用」かつ「標準Web準拠」という二つの顔を持つことができます。
  • デバッグの第一歩: 通信が上手くいかない時は、開発者ツールでこのヘッダーがちゃんと付いているか確認してみましょう。これがあるかないかで、サーバーの振る舞いは180度変わります。

自分自身の名前を誇り高く名乗る。hx-request という身分証明書を合言葉にして、サーバーとブラウザの「無駄のない、完璧な対話」を演出してください。次の記事では、更新される予定の場所をサーバーに伝える hx-target(053. hx-target)をご紹介します。