PHP: GETとPOSTの思想的違い
フォームなどからサーバーにデータを渡す時に使用する GET と POST は、主に形式的な違いのみが取り上げられがちです。私もそのように理解していました。しかしProgramming PHPにはそのように書いてありませんでした。
形式的な違い
GETはURLの後に?をつけて
http://rokujo.esy.es/StockHoloscope/chart.php?mcode=4753&start=20050601&end=20060531
のようにサーバーにパラメーターを渡してやる仕組みです(リンク先はライブドア爆下げの様子です)。データ量が多くなればURLも長くなるので、当然ながら転送量にも限りがあります。また、URLからパラメータが丸見えなのでデータの安全性が低いです。
POSTはURLには手を加えないで、サーバーに直接データを渡してやります。テキストだろうがバイナリだろうがOK、データ量の制限もありません。プログラマからするとPOSTの方がデータが取り出しにくくちょいと面倒です。
思想的な違い
GETはidempotentでないといけません。初めて聞く単語ですね。これは数学用語で、日本語では冪等(べきとう)と言います。定義は
「何回操作を行っても、得られる結果が同じ」
です。つまり、GETは何回行っても必ず同じ表示がされなければいけません。必ず同じ表示がされるならば、URLをブックマークすることも可能です。
これに対して、POSTはidempotentである必要はありません。POSTすることによってウェブページが変化しても問題ありません。むしろ変化することが当たり前です。POSTを行ったページを再表示すると「フォーム再送信の確認」とか「webページの期限切れ」などと表示されます。これはページがPOSTの度に変化してしまうということですから、POSTに冪等性が無いことを表します。ブックマークも不可能です。
例えば
http://this.is.bbs/bbs.php?author=gokuu&content=icchoyattemikka
(URLは架空です)と、形式的にGETで掲示板への書き込みのようなidempotentでない動作をさせることは可能ですが、思想的に許されていません。URLをクリックする度にデータを変化させるようなアクションがあってはならないのです。GETはGETの名前通り、データの取得に徹しなくてはなりません。