はじめに
GETリクエスト、POSTリクエストって何ぞやとなったのでメモ
HTTPリクエストとは
webにおいて、サーバとクライアント間の通信はHTTPというプロトコルを用いている。
クライアントからサーバへの要求は「HTTPリクエスト」、サーバからクライアントへの応答は「HTTPレスポンス」と呼ばれる。
HTTPリクエスト
HTTPリクエストはテキストデータで、
1. HTTPリクエスト部 (常に1行、リクエストの種類をメソッドで指定する)
2. HTTPヘッダー部 (リクエストの詳細情報。複数行)
3. HTTPボディ部 (必要なときだけ)
という構成になっている。
HTTPリクエスト部ではサーバーに送るリクエストの種類を指定する。情報を取り出したいのか、情報を送りたいのか。 リクエストの種類はメソッドの形で指定する。
HTTPヘッダー部はリクエストに関連する各種の補足情報を指定する。サーバー名、ブラウザーの種類、接続維持の指定など。
HTTPボディ部は主に「情報を送る」リクエストの際、送りたい情報を格納する目的で使う。
HTTPリクエストメソッドの種類
メソッドは全部で8種類。そのうち良く使われるのがGETメソッドとPOSTメソッド。
これらを使用したリクエストをGETリクエスト、POSTリクエストと呼ぶ。
メソッド |
意味 |
GET |
サーバ上のファイル本体を取り出す |
POST |
サーバ上のプログラムにデータを送付する |
リクエストパラメータの付与
クライアントからサーバへリクエストするとき、商品IDなどの付加情報(リクエストパラメータ)を送る必要がある。
この方法がGETリクエストとPOSTリクエストで異なる。
GETリクエスト
Webサーバに対してクライアントからGETメソッドでリクエストパラメータを送信するには、
URLに「キー=値」で指定する。リクエストパラメータが複数存在する場合は「&」で連結する。
http://localhost/SamplePHP/http_get_result.php?id=111&name=test
このようにURLを指定してGETで送った際のHTTPリクエストを見てみる。
一行目の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
GETリクエストはリクエストパラメータがURLに付与されるため、送信内容が丸見えとなる。URLはコピーしてどこかに張り付ければ簡単に共有できてしまう。個人情報やパスワードをGETリクエストで送ってしまうとURL上に記載されてしまうため良くない。
更に、URLには長さの制限があるため、長い文章や画像データのような膨大なデータをURLにくっ付けて送ることはできない。
GETリクエストは本来、リソースを取り出すことが目的なメソッドなので、パラメータの送信は簡易的な実装になっている。
POSTリクエスト
Webサーバに対してクライアントからPOSTメソッドでリクエストパラメータを送信するには、HTMLのform要素から送信する。
<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>
ブラウザで表示すると以下のようになる。
送信ボタンを押すとPOSTリクエストが送られる。
idを「111」、名前を「test」にして送信ボタンを押した際の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
id=111&name=test
最後のHTTPボディ部にリクエストパラメータが格納されている。
このPOSTリクエストどこに送られるのかというと、HTMLにてaction=で指定した「http_post_result.php」に送られる。
Webサーバ側の「http_post_result.php」内にて、下記のようにして要素を取り出すことができる。
$_POST['id']
$_POST['name']
ちなみにこれは受け取る側がphpだった場合。pythonだとまた違う表記となる。
また、上記のformをGETリクエストとして送信することができる。その場合はHTMLでmethod="get"と指定する。
まとめ
GETリクエスト、POSTリクエストとはHTTPリクエストの一種。
GETリクエストはページを取得するためのリクエストであり、表示したい商品や動画のid、ページ番号等を送りたいときに使用する。
POSTリクエストは情報を送信するためのリクエストであり、ログインIDや個人情報などを送りたいときに使用する。
参考にしたサイト
Web初心者のためのHTTP、REST入門 - MyEnigma
「HTTP」の仕組みをおさらいしよう(その1):リトライ! 触って学ぶTCP/IP(2)(3/3 ページ) - @IT
HTTP GETとPOSTの違い - ITを分かりやすく解説
GET/POSTの違い&実際の使い分け方
zenn.devPOSTパラメータを扱えるようにする|伸び悩んでいる3年目Webエンジニアのための、Python Webアプリケーション自作入門
HTMLのフォームからPOSTで送信されたデータの受け取り方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン