GETとPOSTの使い分け ついでにPUTとDELETE

More than 1 year has passed since last update.

PHP 5.5.31

CakePHP 2.8.0

GETとPOSTの違いをよく忘れるので、CakePHPの時の使い分けとともにまとめます。

以下を参考に、ところどころ引用しています。

http://techtipshoge.blogspot.jp/2012/08/getpost.html


GETとPOSTの役割

入力フォームのデータをサーバへリクエストするときに使用する。


定義


GETの定義


  • リクエストとして送信されるデータはURLに含まれる

    (「URL?パラメータ名=値」という形式)

    「?」パラメータのはじまり

    「&」パラメータの切れ目

    「=」挟んだ左側がGETの変数名、右側が渡される値


  • データを取得したい時に使用

    データベースの書き換えが必要ない場合。



POSTの定義


  • リクエストとして送信されるデータはメッセージボディ部に含まれる

    メッセージボディは、HTTPリクエストのパラメータ内容を渡す場所。


  • データを変更したい時に使用

    データのソート、更新、削除、新規登録などで使用する場合。

    パスワードのような秘匿情報をURLに表示したくない場合。

    データ量が多い場合。

    バイナリデータを送信したい場合。



実用的な違いと留意点

以下、参考サイトから文章を引用しつつ具体例を書いて理解を深める。


不用意にデータを消去されたり更新される可能性について

GETは、検索エンジンのクローラーがページを見に来る可能性があるため、データベースにアクセスするような内容は書かないようにする。

クローラーが来るたびにデータの追加、変更、削除をされないように、意図的に見に来ないPOSTで処理する必要がある。


キャッシュできるかどうか


  • GETリクエストに対するレスポンスはキャッシュする場合が多い

  • POSTリクエストに対するレスポンスはキャッシュしない場合が多い

POSTがキャッシュしない場合が多い理由は、レスポンス(結果画面)だけをキャッシュして次回以降表示するだけでは、サーバ側で行うデータの追加、変更、削除の処理ができないためである。


URLのブックマーク


  • GETはURLをブックマーク保存できる

  • POSTはURLをブックマーク保存できない

POSTでブックマークできない理由は、実行すると影響が出る処理(購入処理やデータの更新など)をPOSTで処理することが多いので、ブックマークを開くだけでそのような処理が走らないようにするため。

また、POSTの場合はブックマークから開くときにパラメータを含めることができないため、パラメータを必須とするリクエストに対応できないため。

※GETはURLにパラメータを含めることができるためブックマークから開いても正常に処理ができる。


Webサーバやプロキシサーバのログ


  • GETはログが残る。

    URLにデータが含まれるためである。

    リンク先へ移動するとrefererが残る。


  • POSTはログが残らない。



リクエストする文字について


  • GETはASCII文字を使用したほうが良い

マルチバイト文字を使うとエラーが出る場合があるため。


  • POSTは使用する文字に注意しなくてもよい


情報量


  • GETは2,048文字

  • POSTは無制限


更新、ブラウザの戻るボタンによって出るダイヤログ


  • GETはダイヤログによる警告が出ない。

  • POSTはダイヤログによる警告が出る。

データベースを更新するときや秘匿情報の送信でPOSTを利用するため、危険な情報を送信しているか確認する必要があるため。

例)ダイヤログが出ないと、知らない内にオンラインショップの購入を何度も行っているということが起きる。


CakePHPで利用可能なPUTとDELETE


  • PUT

    データの変更(記事の内容やユーザー名を変更)


  • DELETE

    データの削除(記事を削除やユーザーを削除)



CakePHPでリクエストパラメータの取得方法


  • GETの場合

$this->request->query();

(CakePHP3.4以降)

$this->request->getQuery();


  • POSTの場合

$this->request->data();

(CakePHP3.4以降)

$this->request->getData();