POSTメソッド
HTTPで、サーバにデータを送って処理させるときに使うメソッド。送るデータは、リクエストのメッセージボディに入れる。
イマシルちゃんの解説
ログイン画面でIDとパスワードを入れて送信したり、掲示板に書き込んだりするときに使うのがPOSTなんだ。
GETと違って、データはURLじゃなくて「手紙の中身」の部分にしまって送るよ。
だからURLにパスワードが丸見えになったりしないんだ!
より深い解説
定義
POSTは、HTTPのリクエストで、送ったデータをサーバに処理させるメソッドである。データは、ヘッダーの後の空行に続くメッセージボディに入れる。
POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
user=glatch&password=secret
データの形式(Content-Type)
| Content-Type | 使われる場面 |
|---|---|
| application/x-www-form-urlencoded | 普通のHTMLフォーム。キー=値 を「&」でつなぐ |
| multipart/form-data | ファイルのアップロードを含むフォーム |
| application/json | Web APIでJSONを送るとき |
POSTの性質
- べき等ではない:同じリクエストを2回送ると、注文が2回入る、書き込みが2件になる、といったことが起こりうる
- キャッシュされない:原則として、応答はブラウザやプロキシに保存されない
- URLに残らない:データがボディに入るため、履歴やアクセスログ、Refererヘッダーに残りにくい
二重送信の防止
POSTの後にブラウザで再読み込みをすると、同じデータがもう一度送られる。これを防ぐ定番の方法がPRG(Post/Redirect/Get)パターンである。POSTを受けたサーバが処理の後で別のURLへのリダイレクト(303 See Other など)を返し、ブラウザはそのURLをGETで取り直す。こうすると、再読み込みしてもGETが繰り返されるだけになる。
注意点
POSTでもHTTPのままでは通信路上で中身を見られるため、パスワードなどを送るときは必ずHTTPSを使う。POSTは「暗号化」ではなく、「データをURLに載せない」だけである。