PHPの学習を進める際に、初めに引っかかり、判別がややこしかったのが「GETメソッド」と「POSTメソッド」の違いです。今回はその違いを調べてみました。コードを書く際に、はっきりと理解して、適切に使い分けられるようになりたいと思います。
GETメソッドとPOSTメソッドの違いを考える前に、前提として「HTTP」、「HTTP通信」について理解する必要があります。
HTTPとは?
HTTPは「HyperText Trasfer Protocol」の略称で、WebサーバーとWebブラウザの間で通信し、情報をやりとりするための通信プロトコルです。
簡単に言うと、インターネットでサーバーとブラウザが通信するときに使われるルール、約束事のようなものです。
HTTP通信
HTTPを使って通信することをHTTP通信と呼びます。
例えば、ホームページを閲覧する時には、クライアントである「ブラウザ(Google ChromeやMicrosoft Edge)」から「このページが見たい!」という要求を送ります。これがHTTPリクエストです。
その要求に対して、情報やデータを提供することをHTTPレスポンスと言います。
レスポンスを返すコンピュータやソフトウェアのことをサーバーと呼びます。
※画像はいらすとやさんのものを使用させていただきました。ありがとうございます。
「GETメソッド」や「POSTメソッド」は、クライアントからサーバーに向かう「HTTPリクエスト」の種類の一つです。
GETメソッド
HTTPリクエストの一種であり、サーバーから情報を取得したいときに使うメソッドです。
クライアント側からサーバー側に送信するデータを特定の形式でURLの末尾に付与します。それを受け取ったサーバーがレスポンスとして、要求された情報を返します。
このような送信するデータを特定の形式で表示したものを、リクエストパラメータと言います。
URLに対して、「?」以下にパラメータを連結します。パラメータが複数ある場合は、「&」で結合し表示します。
リクエストパラメータを送信する場合は、以下のように表示します。
「?」以下が送信するデータを表します。この場合は、「idが1」、「nameがhoge」のデータを要求していることになります。
http://localhost:0000/index.html?id=1&name=hoge
GETメソッドの特徴
- サーバーから情報を取得する際に使用する
- URLの末尾に入力したデータが表示されるので、他人に見られたくない情報(IDやパスワード等)の送信には不向き
- 渡した値がそのまま履歴として残る
- 送信できるデータ量や種類に限りがある(サーバーから取得するデータを絞り込むために必要な条件)
- テキストデータのみ送信可能(テキストデータ以外のバイナリデータの送信は不可)
POSTメソッド
同じくHTTPリクエストの一種であり、データベースへの値の格納など、クライアントが入力した情報をサーバーへ登録したいときに使用します。
GETメソッドとは違い、リクエストパラメータはリクエストボディに格納して送信されます。つまり、URLにパラメータが表示されずに値の送信が行われます。
実際には、フォームに入力したデータを送るときなどに使われます。
POSTメソッドでは以下のように、リクエスト本文のボディ部分にデータが含まれる形となり、URLには表示されません。
この場合は、「say=Hi&to=Mom」がサーバーに送信したいデータとなります。
//リクエストヘッダ
POST / HTTP/2.0
Host: foo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 13
//リクエストボディ
say=Hi&to=Mom
参照サイト:https://developer.mozilla.org/ja/docs/Learn/Forms/Sending_and_retrieving_form_data
POSTメソッドの特徴
- データベースへの値の格納など、サーバーへ情報を登録するときに使用する
- 送るデータ量が多い場合に使用する
- バイナリデータを送信する場合に使用する。これにより、画像や動画、音声ファイル等のテキストファイル以外のデータの送信が可能になる
- リクエストパラメータはリクエストボディに格納され、URLには表示されないため、IDやパスワードなど他人に見られたくない情報を送る場合に使用される
まとめ・感想
GETとPOSTの違い
GET
1.指定したURLの情報をサーバーから受け取る。
2.リクエストパラメータをURLの末尾に連結して、データを送信する。
3.テキストデータのみ送信できる。
POST
1.クライアントが入力した情報をサーバーに送る。
2.リクエストパラメータは、リクエストボディに格納されデータを送信する。
3.バイナリデータを送信することができる。
GETメソッド、POSTメソッドの違いから、インターネット通信の基本であるHTTP通信について改めて調べて学ぶことができました。このように全体の仕組みを理解しておくことで、ただコードを書くだけでなく、「このような機能を付けたいからこう書くべきだ」「今この作業はこの動きを実現するために書いている」というように、自分で意味を理解しながら開発を進めることができると思いました。
また、調べるうちに一見「POSTを使うのかな」と思えそうな機能も、実はGETを使う場合があることも知りました。もっと学習を進めることで、適切なメソッドを適切なタイミングで使えるような知識を身に付けていきたいと思いました。
これ以外にもまだ、リクエストメソッドは存在するのでそちらもまた別の機会に調べてみたいと思います。
- 参考にした記事
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/GET
https://developer.mozilla.org/ja/docs/Web/HTTP/Methods/POST
https://developer.mozilla.org/ja/docs/Learn/Forms/Sending_and_retrieving_form_data
https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf
https://medium-company.com/http-get-post-%E9%81%95%E3%81%84/
https://blog.senseshare.jp/get-post-method.html