六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

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の名前通り、データの取得に徹しなくてはなりません。