フォーム送信の仕組み|POSTとGETの違いと基本的な使い方
Webフォームでまず押さえたい結論はシンプルです。検索や絞り込みのように「結果を取りにいく」操作は GET、登録や送信のように「状態を変える」操作は POST が基本です。
問い合わせフォーム、ログイン画面、商品検索、管理画面の登録処理。これらは見た目は似ていても、送信方法を間違えると URL に値が出たり、再読み込みで意図しない再送信が起きたりします。フォームの method を理解すると、HTML の書き方だけでなく、API やサーバー側の処理も読みやすくなります。
ここがポイント: GET は URL に載せて取得する、POST は本文に載せて送る。 ただし、POST だから安全という意味ではなく、機密性は HTTPS の有無やサーバー側の実装で決まります。
- 何ができる記事か: フォーム送信の基本、GET と POST の使い分け、最小の HTML 例、よくある失敗をまとめて確認できます
- どんな場面で使うか: 検索フォーム、問い合わせフォーム、ログイン、登録画面、API テストの前提理解に向いています
- 前提: HTML フォームの基本をこれから学ぶ人、または実務で送信方式の選び方に迷っている人向けです
フォーム送信の基本
HTML のフォームは、入力欄に入れた値をまとめて指定先へ送る仕組みです。中心になるのは次の 2 つです。
action: 送信先 URLmethod: 送信方法
最小の例は次のようになります。
<form action="/search" method="get">
<input type="text" name="q" placeholder="キーワード">
<button type="submit">検索</button>
</form>
このフォームでは、q という名前で入力値が送られます。たとえば python と入力すると、GET なら次のような形になりやすいです。
/search?q=python
name 属性が重要なのはここです。name がない入力欄は、送信時に値として含まれません。
GET と POST の違い
ここは実務で最も重要なポイントです。違いを抽象語で覚えるより、実際にどう見えるかで押さえるほうが早いです。
GET は URL に付けて送る
GET は、フォームの値を URL のクエリ文字列として付けて送ります。
- 送信内容が URL に見える
- ブックマークしやすい
- 検索条件の共有がしやすい
- データ取得向き
- HTML フォームでは
methodを省略すると既定値はget
たとえば社内ツールの検索画面なら、次の挙動が便利です。
- 商品名で検索した結果ページをそのまま共有できる
- フィルター条件付きの URL を再訪しやすい
- ページ再読み込みしても意味が変わりにくい
一方で、URL に値が出るため、次の用途には向きません。
- パスワード入力
- 問い合わせ本文の送信
- 会員登録の確定
- 在庫更新や削除処理
POST はリクエスト本文で送る
POST は、フォームデータを HTTP リクエストの本文として送ります。
- URL に値がそのまま出ない
- 作成、登録、更新などの処理で使いやすい
- 長めの入力や複数項目を扱いやすい
- ファイル送信では
multipart/form-dataと組み合わせる
たとえば問い合わせフォームでは、名前、メールアドレス、本文を POST で送るのが自然です。検索 URL のように値を見せて共有する意味がなく、むしろ本文が URL に出ると扱いにくいからです。
ただし、POST は暗号化ではありません。 ブラウザとサーバー間の保護は HTTPS で行います。社内向けでも本番環境では HTTPS 前提で考えるべきです。
まずはこれで判断できる使い分け
迷ったときは、「その送信でサーバー側の状態が変わるか」を先に見ます。
- GET を選ぶ場面
- 検索
- 絞り込み
- 一覧の並び替え
-
ページ移動条件の保持
-
POST を選ぶ場面
- 問い合わせ送信
- ログイン
- 会員登録
- コメント投稿
- 注文確定
- 管理画面での追加や更新
この切り分けにすると、画面設計と API 設計がそろいやすくなります。検索画面なのに POST を使うと URL 共有がしづらくなり、登録処理なのに GET を使うと誤操作や情報露出の原因になります。
基本の書き方
H2 のここでは、最小例で GET と POST を並べて見ます。
GET のフォーム例
<form action="/search" method="get">
<label>
キーワード
<input type="text" name="q">
</label>
<button type="submit">検索</button>
</form>
入力例:
q=javascript
送信後のイメージ:
/search?q=javascript
検索結果ページ、記事一覧、商品一覧のような画面ではこの形が扱いやすいです。
POST のフォーム例
<form action="/contact" method="post">
<label>
お名前
<input type="text" name="name">
</label>
<label>
メールアドレス
<input type="email" name="email">
</label>
<label>
お問い合わせ内容
<textarea name="message"></textarea>
</label>
<button type="submit">送信</button>
</form>
入力例:
name=Yamada
email=test@example.com
message=見積もりをお願いしたいです
POST では、これらの値は URL の末尾ではなくリクエスト本文に入ります。ブラウザの開発者ツールの Network タブを見ると、実際の送信内容を確認できます。
入力例と出力イメージ
コードだけだと動きが見えにくいので、GET と POST の見え方を並べます。
GET の見え方
フォーム:
<form action="/products" method="get">
<input type="text" name="keyword">
<select name="sort">
<option value="price">価格順</option>
<option value="new">新着順</option>
</select>
<button type="submit">表示</button>
</form>
入力:
keyword=ssd
sort=price
URL:
/products?keyword=ssd&sort=price
この形なら、検索条件付きの URL をそのまま保存できます。EC サイトや管理画面の一覧でよく使われる理由はここにあります。
POST の見え方
フォーム:
<form action="/signup" method="post">
<input type="text" name="username">
<input type="password" name="password">
<button type="submit">登録</button>
</form>
入力:
username=masa
password=secret123
送信時のイメージ:
POST /signup
Body:
username=masa&password=secret123
ここで大事なのは、「URL に見えない = 何をしても安全」ではないことです。サーバーログ、保存先、通信の暗号化、バリデーションまで含めて設計する必要があります。
実務での使いどころ
実際の画面に落とすと、使い分けはかなり明確です。
検索フォーム
GET が基本です。
理由は次の通りです。
- 検索条件を URL に残せる
- ブラウザの戻る操作と相性がよい
- チーム内で URL を共有しやすい
- サーバー側でも「取得系」として整理しやすい
問い合わせフォーム
POST が基本です。
問い合わせ内容は URL に出す必要がなく、送信によって受付やメール送信などの副作用が起こるからです。
ログインフォーム
POST を選ぶのが一般的です。
認証情報は URL に出したくなく、ログイン処理はセッション発行などサーバー側の状態変化を伴います。あわせて HTTPS、CSRF 対策、サーバー側の入力検証も必要です。
ファイルアップロード
POST に加えて enctype="multipart/form-data" が必要です。
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">アップロード</button>
</form>
ファイルを含むのに application/x-www-form-urlencoded のまま送ろうとして詰まるケースは初心者に多いポイントです。
よくある失敗
フォーム送信は見た目が簡単なぶん、つまずく場所が似ています。先に知っておくと修正が早いです。
name を付け忘れる
id だけ付いていて name がないと、その値は送信されません。
NG 例:
<input type="text" id="username">
改善例:
<input type="text" id="username" name="username">
検索なのに POST を使う
動作自体はしますが、URL 共有や再検索がしづらくなります。検索・絞り込み・一覧表示はまず GET を検討したほうが自然です。
登録処理なのに GET を使う
ユーザー情報や送信内容が URL に現れやすくなります。ブックマークや履歴にも残りやすいため、登録・更新・削除系には不向きです。
POST なら安全だと思い込む
POST は送信位置が違うだけです。安全性を決めるのは次の要素です。
- HTTPS で送っているか
- サーバー側で入力検証しているか
- CSRF 対策があるか
- パスワードを適切に保存しているか
- ログに機微情報を残していないか
ファイル送信で enctype を忘れる
<input type="file"> を使うのに multipart/form-data を付けないと、サーバー側で期待通りに受け取れません。
GET と POST の比較
ざっくり比較したいときは次を基準にすると判断が速くなります。
| 項目 | GET | POST |
|---|---|---|
| 主な用途 | 取得、検索、絞り込み | 登録、送信、更新 |
| データの置き場所 | URL のクエリ文字列 | リクエスト本文 |
| URL 共有 | しやすい | しにくい |
| フォーム既定値 | はい | いいえ |
| 副作用のある処理 | 不向き | 向いている |
| ファイル送信 | 不可 | 可能(multipart/form-data) |
関連ツールや代替手段
フォーム送信の理解は、HTML だけで終わりません。次のツールにもそのままつながります。
curl: GET と POST の違いをターミナルから再現しやすい- Postman: API リクエストの body や query を視覚的に確認しやすい
- ブラウザ開発者ツール: 実際に送られた URL、ヘッダー、本文を確認できる
- JavaScript の
fetch: フォーム送信を非同期化するときの基礎になる
特に、フォームでつまずいたらブラウザの Network タブを見る習慣が有効です。HTML の書き方だけを見ていても、送信先 URL や本文の実体は分かりません。
迷ったときのチェックリスト
最後に、実務での判断を短く整理します。
- 検索や絞り込みなら GET を検討する
- 登録や送信なら POST を選ぶ
- パスワードや本文を GET に載せない
- ファイル送信なら
multipart/form-dataを付ける name属性があるか確認する- POST でも HTTPS とサーバー側検証は別途必要と考える
フォーム送信は小さな機能に見えますが、ここを正しく選べると画面設計、API 設計、セキュリティの判断が一気につながります。次に見るべきポイントは、ブラウザの開発者ツールで実際の GET と POST を見比べることです。見える形で理解すると、HTML の 1 行が何を変えているかがはっきり分かります。
