HTTPメソッドのPOSTとPUTの冪等性

昨日の記事のはてブコメントにて、POSTとPUTの使い分けには冪等性が重要ですよとのアドバイスをいただいた。ので、冪等性について調べてみた。

冪等性と安全性

@tkawaさんに、はてブコメントにてアドバイスいただいたのは冪等という考え方。

これに加えて、性質の違いとしてPOSTは冪等ではないがPUTは冪等というのも重要です

冪等ってあまり聞かない用語だけど、この冪等についても、Webを支える技術にはちゃんと書いてあった。 

冪等とは「ある操作を何回行っても結果が同じこと」を意味する数学用語です。たとえばPUTとDELETEは冪等ですので、PUTやDELETEを同じリソースに何回発行しても、必ず同じ結果(リソースの内容が更新されている、リソースが削除されている)が得られます。

安全とは「操作対象のリソースの状態を変化させないこと」を意味します。リソースの状態に変化を与えることを副作用といいますので、安全は「操作対象のリソースに副作用がないこと」とも言います。たとえばGETには副作用がないので、GETを同じリソースに何回発行してもリソースの状態は変化しません。

Webを支える技術 -HTTP、URI、HTML、そしてREST

メソッド 性質
GET, HEAD 冪等かつ安全
PUT, DELETE 冪等だが安全でない
POST 冪等でも安全でもない

これを読むと、PUTは送信の度に同じ結果(コンテンツの内容は変化してもいいが、レスポンスの種類が同じという意味合いかな?)にならなければならず、逆にPOSTはそうでない場合に使用するみたい。この“同じ結果になる”というのが冪等性。考え方として、何か送信するものを実装するときには、まず「PUTが適していないか?」を考え、適してない場合にはPOSTを使う、というのが良いみたい。で、Nekostagramの場合は、送信ボタンを何度押しても対象ページを更新するだけなので、PUTが適していると言えそう。

@tkawaさんにさらに詳しくアドバイスもらいました。ありがとうございます。この場合はPOSTでもなくPUTでもなく、GETが最も適しているとのことでした。むずかしい…。

ここらへんもうちょっと掘り下げて学ぶために、オライリーのRESTful Webサービスも買ってみた。読む時間を作らねば。