PostとGet

PostとGetの使い分け

どっちでも良いわけではないのはわかるが
しかし、postの部分をgetにする具体的な理由がわからなかった。
getの部分をpostで作ると、キャッシュやパーマリンクで困る。

冪等(PostとGetの違いに絡んで)

数学において、冪等性(べきとうせい、英: idempotence)とは、大雑把に言って、ある操作を1回行っても複数回行っても結果が同じであることをいう概念である。

(中略)

HTTP の GET 要求は冪等とみなされる。
Webの機構は基本的にその前提で要求結果をキャッシュに保持する。
HTTP の POST 要求(フォーム送信に使われる)は冪等とはみなされないため、
POST 要求はキャッシュされない。
HTTP の DELETE 要求(指定したURIのリソースを削除する要求)も冪等である。
冪等は、単に処理中の要求を再度受け付けたときに何もしないというだけではない。
そのような操作は冪等ではなく安全(safe)であるという。

————————-

HTTP の GET メソッドと POST メソッドについて、改めて書きたいことがあります。
定義の中のある箇所が世間では軽視されているように思うのです。

Wikipedia に簡潔かつ正確に解説されている話ですが、ここで改めて解説を。
http://ja.wikipedia.org/wiki/%E5%86%AA%E7%AD%89#WWW

HTTP 1.1 の通信手順・動作を定義している RFC 2616
http://www.ietf.org/rfc/rfc2616.txt
に「9.1.2 Idempotent Methods」という節があります。

“Idempotent” の形容詞 “Idempotence” とは
「N(>0)回実行された際の副作用が、1回のみ実行された際の副作用と同じ」
と定義されています。平たく言うと、
1回目の実行で何か変化が起きる(かもしれない)のですが、
2回目以降の実行では変化が起きないという意味です。
日本語では「冪等」と訳されます。
これは数学用語で、一般の英和辞典には見つかりません。

RFC 2616 では
GET、HEAD、PUT、DELETE が Idempotent Methods であり、
また OPTIONS、TRACE は副作用を持つべきではないと定義しています。
裏を返すと POST は Idempotent Methods ではありません。

この定義はブラウザやプロキシサーバのキャッシュに影響します。
2回目以降に変化が起きないリクエストは、キャッシュを使って回数を減らして構いません。
リクエストの度に変化が起きるメソッドは、
キャッシュを使って回数を減らすと結果が変わってしまいます。

つまり GET メソッドの結果はキャッシュしてもいいですが、
POST メソッドの結果はキャッシュしてはいけません。

Web プログラミングに詳しい人なら、
GET メソッドの度に状態を変化させるプログラムを
CGI/PHP 等で作れることを知っているでしょう。
アクセス回数を数えるアクセスカウンタはそうして作られています。
文書で決めることに意味がないと考える方もいらっしゃるかもしれません。

しかし GET と POST の違いを決めておくことに意味があります。
目的に応じて使い分ける基準になります。
さらには、世に広まっているブラウザやプロキシサーバのキャッシュは
この定義に従って実装されているので、
Web アプリを開発する際に定義に逆らうと
キャッシュ制御でトラブルを起こしやすいんです。

キャッシュして欲しいデータを POSTで取得するようにプログラミングすると
キャッシュが効かなくて困るようになります
-よくある「フォームの期限切れ」- し、
キャッシュされては困るデータを GET で取得するようプログラミングすると
キャッシュの無効化を考えなければなりません。
アクセスカウンタは HTML に埋め込みたいので
GET メソッドで取得しますが、キャッシュの動作から考えると例外的です。

キャッシュのコントロールを考えたときに、
GET と POST を使い分けてキャッシュの動作を変える方法もあるのです。