048. Form Data(フォームデータ送信:荷物をまとめてサーバーへ届ける)
原理:Web通信の「標準の配送便」
荷物をひとまとめにする仕組み
これまでの記事で習ったパラメータ(クエリやパス)は、いわば「封筒の外側に書かれたメモ」のようなものでした。それに対して、今回解説する「Form Data(フォームデータ)」は、封筒の「中身」そのものです。
ユーザーが名前を打ち込み、性別を選び、チェックボックスに印を付ける。 これらの多種多様な情報を、サーバーが解読できる一つの「荷物(データ形式)」にまとめ上げ、POSTやPUTといった通信に乗せて一気に届ける。これがフォームデータ送信の本質です。
HTMXでは、特別な設定をしなくても、この「荷造り」を非常に賢く、自動で行ってくれます。
実践:HTMXがやってくれる「自動荷造り」
1. 親フォームの値を自動で集める
HTMXのボタンが <form> タグの中に置かれている場合、HTMXはそのフォーム内にあるすべての入力欄(<input>, <select>, <textarea>)の値を、自動的にかき集めて送信してくれます。
<form hx-post="/api/register" hx-target="#message">
<input type="text" name="username" placeholder="名前">
<select name="country">
<option value="jp">日本</option>
<option value="us">アメリカ</option>
</select>
<!-- ここでボタンを押すと、usernameとcountryが自動で送信される -->
<button type="submit">登録する</button>
</form>
<div id="message"></div>
2. 外部の要素からも値を集める(hx-include)
ボタンがフォームの外にあったり、別の場所にある入力欄を「ついでに」一緒に送りたい場合は、hx-include 属性を使って荷物に混ぜることができます。
<input type="checkbox" id="agree-check" name="agree"> 同意する
<!-- ボタンは離れた場所にあるが、#agree-check の値も一緒に送る -->
<button hx-post="/api/submit" hx-include="#agree-check">
送信
</button>
3. ステップ・バイ・ステップ解説
- 名前(name)の重要性: 各入力項目には必ず
name属性を付けてください。これが、サーバー側で「どの箱に何のデータが入っているか」を識別する唯一の手がかり(キー)になります。 - データ形式: 標準では
application/x-www-form-urlencodedという形式で送られます。これは「名前=中身1&名前2=中身2」という風に、データを1本の紐のように繋げた形式です。 - サーバーで解読: サーバー側(Node.js, PHP, Rubyなど)は、届いた荷物を自動で解読し、「usernameの中身は田中、countryはjp」といった風に取り出して使うことができます。
比較:通常のForm送信 vs HTMXのデータ送信
通常のHTML Form
- 挙動: 送信後、ブラウザは必ずページをリロード(あるいは遷移)しようとします。
- 課題: 画面が一瞬白くなり、ユーザーの操作が途切れます。
HTMXのデータ送信
- 挙動: 荷造りは全く同じですが、通信を「裏側」で行います。
- メリット: ユーザーは今のページに留まったまま、保存や登録の完了を(一部の書き換えだけで)知ることができます。
まとめ:初心者のための「荷解き」の約束
フォームデータ送信は、あなたとサーバーを結ぶ「最もタフで確実な配送便」です。
- 「name」を忘れない: これがないと、どんなに入力してもらってもサーバー側では「名無しのデータ」になってしまい、ゴミ箱に捨てられてしまいます。
- 適切な method を選ぶ:
- 新しいものを作るなら
hx-post - 今あるものを上書きするなら
hx-put - 情報の一部を直すなら
hx-patch
- 新しいものを作るなら
- ファイル送信には注意: 写真などのファイルを送る場合は、さらに頑丈な荷造り(
hx-encoding="multipart/form-data"、029.解説)が必要です。
ユーザーの入力を、大切に、正確にサーバーへ。hx-include などの便利な属性も駆使しながら、自由自在な「データの配送ルート」を構築してください。次の記事では、プログラミングの世界で今最も好まれている形式「JSONリクエスト(049. JSON Request)」との付き合い方について解説します。