情報処理

HTTP GETとPOSTの違い

HTTP GETとPOSTの違い

HTTPとは

HTTP(Hypertext Transfer Protocol)とは、Webサイトを表示する際に使用するプロトコルです。クライアントとWebサーバ間でHTMLなどで記述されたWebページの送受信で使用されます。

HTTPイメージ図

HTTPの通信を開始できるのは、クライアント側のみです。クライアントからHTTP リクエストを送り、WebサーバがクライアントにHTTP レスポンスを返す仕組みです。

この時、クライアントが投げるHTTPリクエストの代表的なメソッドには「HTTP GET」と「HTTP POST」があります。

スポンサーリンク

本記事では「HTTP GET」と「HTTP POST」の違いについて紹介しています。

HTTP GETとは

HTTP GETとは、指定されたURIのリソース(Webサイトの内容など)を取り出す、「HTTP/0.9」のバージョンから存在するHTTPの基本メソッドです。

HTTPイメージ図

上記図のようにクライアントが「URI」を指定し、Webサーバはその「URI」の内容を返すシンプルなメソッドです。

HTTP GETでのパラメータ送信

Webサーバに対してクライアントから「HTTP GET」でリクエストパラメータを送信する方法は、次のように「キー = 値」で指定します。

そして、リクエストパラメータが複数存在する場合は「&」で連結します。

http://localhost/SamplePHP/http_get_result.php?id=111&name=test

「HTTP GET」では、リクエストパラメータがURLに付与さるため送信内容が丸見えです。そのため、重要な情報などは「HTTP GET」ではなく「HTTP POST」を利用するのが一般的です。

HTTP GETは本来リソースを取り出すことが目的のメソッドなので、パラメータの送信も簡易的な実装になっています。

HTTP GETのサンプルプログラム

PHPで簡単な「HTTP GET」のサンプルプログラムを作り、実際の動作確認をしてみます。

「HTTP GET」送信サンプル

idと名前をリクエストパラメータとして「HTTP GET」で送信するサンプルです。画面イメージは次の通り。

■ 画面イメージ

HTTP GETサンプル画面

■ ソースコード(http_get_index.php)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTTPメソッドテスト</title>
</head>
    <body>
        <h1>HTTP Getテスト</h1>
        <form action="http_get_result.php" method="get">
            id:<input type="text" name="id"/><br />
            名前:<input type="text" name="name"/><br />
            <input type="submit" value="送信" />
        </form>
    </body>
</html>

■ HTTPリクエストヘッダ

「HTTP GET」のHTTPヘッダは次の通りです。「GET /SamplePHP/http_get_result.php?id=111&name=test HTTP/1.1」とHTTPヘッダ内にリクエストパラメータが付与されています。

GET /SamplePHP/http_get_result.php?id=111&name=test HTTP/1.1
Host: localhost
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Referer: http://localhost/SamplePHP/http_get_index.php
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.9,en;q=0.8

スポンサーリンク

「HTTP GET」受信サンプル

「HTTP GET」で送信した結果を表示する画面のイメージは次の通りです。URLに「HTTP GET」で送信したパラメータが連携されているのが分かります。

■ 画面イメージ

HTTP GET結果

■ ソースコード(http_get_result.php)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
    <body>
        <h1>HTTP Getの結果.</h1>
        <div>id=
            <?php
            if(isset($_GET['id'])){
                $id = $_GET['id'];
                echo $id;
            }
            ?>
        </div>
        <div>名前=
            <?php
            if(isset($_GET['name'])){
                $name = $_GET['name'];
                echo $name;
            }
            ?>
    	</div>
    </body>
</html>

HTTP POSTとは

HTTP POSTとは、クライアントからの入力内容をWebサーバに送信するために使用するメソッドです。

「お問い合わせフォーム」や「登録画面」などから利用者が入力した内容をWebサーバに送り、Webサーバのデータベースに蓄積する際などに利用します。

HTTP POSTイメージ図

HTTP POSTでのパラメータ送信

Webサーバに対してクライアントから「HTTP POST」でリクエストパラメータを送信する方法は、次のように「キー = 値」で指定します。

そして、リクエストパラメータが複数存在する場合は「&」で連結します。

id=111&name=test

「HTTP GET」では、リクエストパラメータがURLに連携されていましたが、「HTTP POST」ではリクエストパラメータがBody部に格納されます。

HTTP POSTのサンプルプログラム

PHPで簡単な「HTTP POST」のサンプルプログラムを作り、実際の動作確認をしてみます。

スポンサーリンク

「HTTP POST」送信サンプル

idと名前をリクエストパラメータとして「HTTP POST」で送信するサンプルです。画面イメージは次の通り。

■ 画面イメージ

HTTP POST送信イメージ

■ ソースコード(http_post_index.php)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTTPメソッドテスト</title>
</head>
    <body>
        <h1>HTTP POSTテスト</h1>
            <form action="http_post_result.php" method="post">
                id:<input type="text" name="id" /><br />
                名前:<input type="text" name="name"/><br />
                <input type="submit" value="送信" />
            </form>
    </body>
</html>

■ HTTPリクエストヘッダ

「HTTP POST」のHTTPヘッダは次の通りです。「HTTP GET」とは違いHTTPヘッダ内にリクエストパラメータは格納されていません。

POST /SamplePHP/http_post_result.php HTTP/1.1
Host: localhost
Connection: keep-alive
Content-Length: 16
Cache-Control: max-age=0
Origin: http://localhost
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
Sec-Fetch-Dest: document
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Referer: http://localhost/SamplePHP/http_post_index.php
Accept-Encoding: gzip, deflate, br
Accept-Language: ja,en-US;q=0.9,en;q=0.8

■ HTTPボディ

「HTTP POST」ではHTTPのBody部にリクエストパラメータが格納されています。

id=111&name=test

「HTTP POST」受信サンプル

「HTTP POST」で送信した結果を表示する画面のイメージは次の通りです。「HTTP GET」とは違いURLにパラメータが連携されていないのが分かります。

■ 画面イメージ

HTTP POSTの受信イメージ

■ ソースコード(http_post_result.php)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
    <body>
        <h1>HTTP Postの結果.</h1>
        <div>id=
            <?php
            if(isset($_POST['id'])){
                $id = $_POST['id'];
                echo $id;
            }
            ?>
        </div>
        <div>名前=
            <?php
            if(isset($_POST['name'])){
                $name = $_POST['name'];
                echo $name;
            }
            ?>
    	</div>
    </body>
</html>

まとめ

HTTPの代表的なメソッドである「HTTP GET」と「HTTP POST」の違いについて紹介しました。

「HTTP GET」と「HTTP POST」の違いは、大きく分けて2つあります。

1つ目は役割の違い

役割の違い

HTTP GET:指定したURLの内容をWebサーバから取り出す(GET)

HTTP POST:クライアントが入力した内容をWebサーバに送る(POST)

2つ目は、リクエストパラメータの送信方法の違い

送信方法の違い

HTTP GET:URLに連携して送信

HTTP POST:HTTP Bobyに格納して送信

Copyright© ITを分かりやすく解説 , 2020 All Rights Reserved.