PHPを勉強しているとHTTPリクエストとかGETとかPOSTって出てくるけど、なんだかよく分からない……。
今回はこのようなお悩みをお持ちの方に向けてHTTPリクエストについて解説をしていきます。
- HTTPリクエストとは?
- そもそもHTTPとは?
- GETとPOSTとは?
- GETとPOSTのプログラミング(PHP)での使い方
PHPでWebアプリを開発するならHTTPリクエストの理解やGET、POSTを扱えるようになることは必須条件です。
この記事が少しでも理解の一助となれば幸いです。
HTTPリクエストとは?
HTTPリクエストとは、簡単に言うと
クライアントからサーバーに対する何らかの要求(リクエスト)のこと
です。
身近な例では、Google検索で表示された検索結果のリンクを押下したときの動きがまさにそれです。
- Goole検索をする
- 結果一覧が表示される
- いずれかのリンクをクリックする → このときサーバーにHTTPリクエストが飛んでいる
- (結果が返ってきて)Webページが表示される
つまり、皆さんがこのブログ記事を訪れる際にも「『https://kekenta-it-blog.com/http-request-get-post/』のページを下さい」と知らず知らずサーバーに要求(HTTPリクエスト)していたということです。
そして、この要求(HTTPリクエスト)に対して、
- サーバーはこの記事のページ情報を返し
- ブラウザが受け取った記事のページ情報を表示している
という流れになっています。
HTTPとは?
ところで、先ほどからずっと登場しているHTTPとは何を意味しているのでしょうか?
HTTPというのは、プロトコルの1つです。
ぷろとこる……?
馴染みのない用語かもしれませんが、プロトコルとは簡単に言うと
ITの世界で定められている「取り決め」のこと
です。
例えば、「ブラウザさんとサーバーさんはこんな風にしてやり取りをしてください」という風に予めルールが定められています。
このルールのことをIT専門用語でプロトコルと呼びます。
現実世界に例えるなら、手紙を郵送するときの流れが挙げられます。
- 手紙を書く
- 封筒に宛名と自分の住所を書く
- 切手を貼る
- ポストに投函する
- 郵便屋さんが手紙を回収する
- 適切な手続きにより手紙が宛先へと届けられる
このように、現実世界で手紙を出す場合は、ある定められたルールに従って手順を踏みます。
ブラウザとサーバー間でも「こんな風にやり取りをして」、と予めルールが定められているのです。
このルールのことをプロトコルと言い、HTTPはその内の1つなのです。
HTTPとは、ブラウザとサーバーとの間でやり取りをする際のルールのこと
そして、本題であるHTTPリクエストとは、HTTPの内、ブラウザからサーバーへ送信するリクエストのことを指しています。
HTTPリクエストとHTTPレスポンス
たったいま、HTTPリクエストは、HTTPでのやり取りの内、ブラウザからサーバーへのリクエストのことを指すとご説明しました。
一方、サーバーからブラウザへ返ってくる回答をHTTPレスポンスと呼びます。
HTTPレスポンスによって得られるのが、ブラウザに表示されるWebサイトなどです。
HTTPリクエストとHTTPレスポンスは2つで1つの概念ですので、この場で簡単にご紹介させて頂きました。
HTTPリクエストの種類~GETとPOST~
HTTPリクエストにはいくつか種類があります。
その内、最も基本的なHTTPリクエストがGETとPOSTです。
- GET
-
URLで指定したページを要求するために使用するHTTPリクエスト
- POST
-
クライアントからサーバーへデータを送信するために使用するHTTPリクエスト
それぞれ役割は明確に異なります。
しかし、初心者の方にとってややこしいのが、プログラミングにおいて、実はどちらを使用しても望んだ機能を実現することが可能という点です。
例えば、ユーザーがフォームに入力したデータをデータベースに保存したい場合、フォームの入力内容をHTTPリクエストで送信する必要があります。
しかし、GETとPOSTのどちらを使用してもこの機能は実装できてしまうのです。
初心者の方は最初の内は使い分けが難しいと感じるかもしれません。
GETとPOSTの具体的な違いは以下の通りです。
GET | POST | |
---|---|---|
使用用途の例 | 検索機能 | フォーム情報をDBに登録 DB上のデータを削除 既存データの編集 |
リクエスト情報の可視 | 可視 ※URLの後ろに情報が付与される | 不可視 ※HTTPリクエストのボディ部分に記載。 ツールを使用することで情報を見れるため、安全性を担保するならHTTPS通信などによる暗号化が必要 |
大きな違いは、リクエスト情報が表面上から見えるかどうかという点です。
GETの場合、URLの後ろに情報が付与される形になるため、ユーザーが普通にWebサイトを利用していても情報が見えてしまいます。
一方のPOSTは、HTTPリクエストのボディ部分、つまり内部的な部分に情報が付与されるため、表面からは見えません。
しかし、何らかのツールを利用すると簡単に見れてしまうため、セキュリティ上の安全性を考えるならHTTPS通信などによって情報そのものを暗号化する必要があります。
GETとPOSTの使い分けのポイントは、HTTPリクエストで送信する情報の機密性にあります。
その情報が、例えば単なる検索キーワードなら表面上にデータが見えても問題ないためGETが候補に挙がります。
一方、ユーザー情報など機密性の高い情報を扱う場合は、基本的にはデータが表面上に見えないPOSTを利用するのが適切です。
GETとPOSTのプログラミング例
本章ではGETとPOSTを実際にPHPで使用する場合の例をお見せします。
実装の際のご参考になれば幸いです。
GET
GETを使用する場合は、formタグのmethod属性に「get(GET)」を指定します。
また、GET送信された値を取得する際はスーパーグローバル変数の$_GETを使用します。
以下は「usernameをGET送信し、PHPの処理で出力する処理」です。
<form action="kekenta-sample.php" method="get">
名前:<input type="text" name="username" value=""><br>
<input type="submit" value="送信">
</form>
<?php
//$_GET['username']が存在していれば
if( isset( $_GET['username'] ) && $_GET['username'] != '' ){
echo "あなたのユーザー名は:" . $_GET['username'] . "です。";
}
?>
ちなみに、上記のユーザ名が例えばkekentaだった場合、遷移先のページではURLが以下の表示になります。
https://kekenta-sample.php?username=kekenta
今回はユーザーの入力値を利用しているためこの書き方を使用することはできませんが、GET送信を行いたい場合は
<a href=”https://kekenta-sample?キー名①=値①,キー名②=値② …… ”>
という形でリンクに直接記述することも可能です。
POST
POSTを使用する場合は、formタグのmethod属性に「post(POST)」を指定します。
また、POST送信された値を取得する際はスーパーグローバル変数の$_POSTを使用します。
以下は「usernameをPOST送信し、PHPの処理で出力する処理」です。
<form action="kekenta-sample.php" method="post">
名前:<input type="text" name="username" value=""><br>
<input type="submit" value="送信">
</form>
<?php //$_POST['username']が存在していれば
if( isset( $_POST['username'] ) && $_POST['username'] != '' ){
echo "あなたのユーザー名は:" . $_POST['username'] . "です。";
}
?>
ちなみに、POSTの場合も実はGETのときと同じようにURLにキー=値という形で情報を埋め込むことも可能です。
それに加えて、POSTの場合はHTTPリクエストのボディ部分(表面からは見えない部分)に情報を埋め込んで送信することが可能です。
GETとPOSTを適切に使い分けることが大切
ここまでHTTPリクエストやその代表であるGETとPOSTについて解説をしてきました。
HTTPとは、ブラウザとサーバーとの間でやり取りをする際のルール(プロトコル)のこと
- HTTP
-
ブラウザとサーバーとの間でやり取りをする際のルール(プロトコル)
- HTTPリクエスト
-
HTTPの内、ブラウザからサーバーへ送信するリクエスト
- GET
-
URLで指定したページを要求するために使用するHTTPリクエスト
機密性が低い情報の送信に適している - POST
-
クライアントからサーバーへデータを送信するために使用するHTTPリクエスト
機密性が高い情報の送信に適している
前章のプログラミング例をご覧いただきお分かりいただけたかと思いますが、GETでもPOSTでも機能的には全く同じものを実現することが可能です。
しかし、GETとPOSTには明確な違いあり、誤った方を使用するとセキュリティリスクも高まります。
扱う情報の機密性をきちんと考慮し、適切な方を使用することが大切です。
なお、実際のアプリ開発でGETやPOSTが使用されている様子をご覧になりたい方は、以下の掲示板アプリ解説の記事内のコードが参考になるかと思います。
それでは最後までお読みいただきありがとうございました。
また別の記事でお会いできれば光栄です。
PHPの独学に限界を感じている方へ