リクエスト・レスポンス
HTTPリクエストとHTTPレスポンス
「クライアント」(利用者が操作する端末やブラウザなど)と、情報を提供する「サーバー」という2つの役割の間では、決まった形式のやり取りが行われています。クライアントがサーバーに送る依頼が「HTTPリクエスト」、それに対してサーバーが返す応答が「HTTPレスポンス」です。必ずHTTPリクエストが送信されて初めてHTTPレスポンスが返ってくる仕組みになっており、レスポンスだけが単独で送られてくることはありません。
(PC・スマホ・タブレットなど)
← HTTPレスポンス
ぽち先生のヒント宅配便に「集荷をお願いします」と依頼して初めて、荷物を取りに来てもらえるのと同じだよ。こちらから頼む前に荷物が届くことは絶対にないよね。HTTPも同じで、必ずリクエストが先、レスポンスが後という順番は変わらないんだ。
HTTPリクエストを構成する3つの要素
HTTPリクエストは、次の3つの要素が横に並んでいるのではなく、上から下へ縦3段で並んだ、1つのまとまったメッセージです。
このあと、それぞれの要素を1つずつ詳しく見ていきましょう。
ぽち先生のヒント宅配便の伝票と荷物に例えられるよ。伝票の宛先欄が①リクエストライン、伝票の特記事項欄が②リクエストヘッダー、そして箱の中身が③リクエストボディなんだ。
HTTPリクエストライン
リクエストラインは、HTTPリクエストの1行目に書かれる、「何を」「どこに」要求するかを示す情報です。「メソッド」「パス(URL)」「HTTPのバージョン」という3つの要素で構成されています。
GETメソッド/index.htmlパス(URL)HTTP/1.1HTTPバージョンこの例なら「index.htmlというページを、GETメソッドで、HTTP/1.1というルールに従って取得してください」という意味になります。
ぽち先生のヒント宅配便の伝票の宛先欄と同じだよ。「誰に」「どんな配送方法で」届けてほしいかを、一番最初にはっきり書いておく部分なんだ。
メソッドとは
メソッドとは、サーバーに対して「何をしてほしいか」を伝える命令の種類です。数あるメソッドの中でも、普段のWeb閲覧で圧倒的によく使われるのが、情報を取得する「GET」と、データを送信する「POST」です。ほかにも、API開発などでは次のようなメソッドが使い分けられます。
この後は、特によく使われるGET・POSTがどんな場面で呼ばれるのか、詳しく見ていきましょう。
ぽち先生のヒント宅配業者への依頼にもいろいろな種類があるのと同じだよ。「集荷」「再配達」「追跡」のように、目的に応じた専用の頼み方が用意されているんだ。
HTTPリクエストヘッダー
リクエストヘッダーは、リクエストラインだけでは伝えきれない、追加の情報を伝える部分です。「名前: 値」という形式で、複数行にわたって書かれます。
サーバーはこれらの情報をもとに、レスポンスの内容を調整することもあります。特にUser-Agentは「どんな端末・ブラウザから見られているか」、Refererは「どこから来たアクセスか」を知る手がかりになるため、アクセス解析やマーケティング分析でもよく使われる情報です。Cookieについては個別トピックで詳しく解説します。
ぽち先生のヒント宅配便の伝票の「差出人欄」+「特記事項欄」に例えられるよ。誰が送ったかという情報と、「割れ物注意」のような細かい指示を、荷物本体とは別に書き添える欄なんだ。
HTTPリクエストボディとは
リクエストボディは、サーバーに送信したいデータそのものが格納される部分です。GETのようにデータを送らないメソッドでは空になりますが、POSTのようにデータを伴うメソッドでは、ここにフォームの入力内容などが入ります。
入力内容
格納
受け取る
ぽち先生のヒント宅配便の箱の中身そのものに似ているよ。伝票にどれだけ詳しく書いても、実際に運ぶものが箱にちゃんと入っていないと意味がないよね。
ユーザー側からページにアクセスした際は基本的にGETメソッドが呼ばれる
URLを直接入力する、リンクをクリックする、ブックマークから開く——こうした「ページを見に行く」操作は、基本的にすべて「GET」メソッドでリクエストが送られます。GETは、指定した場所にある情報を「そのまま見せてください」とお願いするための、閲覧向けのメソッドです。
直接入力
クリック
から開く
要求
表示される
ぽち先生のヒント宅配便の窓口に行くと、何も言わなくても料金表や案内チラシを渡されるのに似ているよ。何か依頼をしなくても、置いてある情報がそのまま差し出されるよね。GETも同じで、情報を見せてもらうだけの操作なんだ。
POSTはWebページでPOSTアクションを指定した場合限定で呼ばれる
一方「POST」は、Webページ側で明示的に「ここではPOSTを使う」と指定されている場合に限って使われます。代表的なのは、フォームの送信ボタンを押したときです。HTMLの<form>タグにmethod="post"と指定されていると、その送信時にPOSTリクエストが送られます。指定がなければGETが使われるため、POSTは「ここぞ」というときに使われる特別なメソッド、と捉えるとわかりやすいでしょう。
このとき送信されるのは、ユーザーが実際に入力した値だけではありません。Web制作者があらかじめページに埋め込んでおいたhidden項目の値も一緒に、パラメーターとしてリクエストボディへ格納されて送られます。
入力
クリック
送信
リクエストボディに格納
データを処理
ぽち先生のヒント宅配便の窓口で、配送伝票に必要事項を記入して荷物を渡すのに似ているよ。伝票に書き込んだ内容と荷物をまとめて渡して初めて、集荷してもらえるよね。POSTも同じで、入力した内容をまとめて渡して初めて、サーバーに処理してもらえるんだ。
パラメーターとは
パラメーターとは、リクエストに含めてサーバーに渡す「値」のことです。パラメーターはname=ぽち&email=pochi@example.comのように「キー=値」の形式で表され、複数ある場合は&でつなげます。
GETとPOSTでは、このパラメーターの置き場所が異なります。
/searchパス?区切り文字keyword=犬パラメータ(クエリ文字列)
入力
格納
表れない
GETはパラメーターがそのままURLの末尾に付け加えられるのに対し、POSTはリクエストボディの中に隠れているため、URLだけを見てもパラメーターの中身はわかりません。
ぽち先生のヒント宅配便の伝票に書き込む項目に似ているよ。「お届け先」「電話番号」のように、項目名と実際に書き込む内容がセットになっているんだ。GETはこの内容を伝票に直接書き込んで誰でも見える状態、POSTは箱の中に入れて外からは見えない状態、というイメージなんだ。
GET、POSTでパラメータを渡す場合のメリットとデメリット
メリットパスワードなど他人に見られたくない値はPOSTで送るのが基本です。検索条件のように「あとでURLだけ共有したい」情報はGETが向いています。
ぽち先生のヒントGETは「伝票に大きく書かれた宛先」、POSTは「箱に入れて封をした中身」に似ているよ。伝票の記載は誰でもすぐ見られて確認しやすいけど内容は丸見え。箱の中身は開けないと見えない分、ある程度の秘密を保てるんだ。
HTTPレスポンスを構成する3つの要素
ここからはHTTPレスポンス側を見ていきます。レスポンスも、リクエストと同じように、横並びではなく縦3段で構成された1つのまとまったメッセージです。
ぽち先生のヒント荷物を受け取ったときの「受領書」に似ているよ。受け取りましたという一言(①ステータスライン)、受領に関する注意書き(②レスポンスヘッダー)、そして実際に届いた中身(③レスポンスボディ)、という組み合わせなんだ。
HTTPステータスライン
ステータスラインは、HTTPレスポンスの1行目に書かれる、リクエストの結果を表す情報です。「HTTPのバージョン」「ステータスコード」「説明文(リーズンフレーズ)」という3つの要素で構成されています。
HTTP/1.1HTTPバージョン200ステータスコードOK説明文(リーズンフレーズ)
ステータスコードが何を意味するか(200番台・400番台・500番台など)は、プロトコル(HTTP)の個別トピックで詳しく解説しています。
ぽち先生のヒント宅配便の送付結果に似ているよ。追跡サイトで表示される「配送システムのバージョン」「配送結果を表す状況コード」「『配達完了』のようなひとことの説明」、この3つで「荷物がどうなったか」を短く伝えてくれるんだ。
HTTPレスポンスヘッダー
レスポンスヘッダーは、レスポンスボディをどう扱えばよいかをブラウザに伝える、追加の情報です。リクエストヘッダーと同じく「名前: 値」の形式で書かれます。
これらの情報をもとに、ブラウザは受け取ったデータを正しく解釈して表示できます。Cookie・キャッシュについては、それぞれの個別トピックで詳しく解説します。
ぽち先生のヒント宅配便の箱に貼られている「取り扱い注意」シールに似ているよ。中身(レスポンスボディ)をどう扱えばいいかという情報が、荷物とは別に貼り付けられているんだ。
HTTPレスポンスボディ
レスポンスボディは、サーバーが返す実際のデータそのものが格納される部分です。Webページであれば表示用のHTML、APIであればJSON形式のデータなどが、ここに入っています。
<html><body>...</html>
ブラウザがそのまま画面に表示する
{"name": "ぽち", "age": 3}
プログラムが値を読み取って処理する
文字としては読めないデータの並び
画像や音声、PDFなどをそのままの形で送る
どの形式でデータが返ってきたかは、直前のスライドで見た「Content-Type」ヘッダーによってブラウザに伝えられます。
ぽち先生のヒント宅配便で実際に届く荷物そのものだとイメージしてみて。ステータスラインが「お届けに上がりました」という一言、レスポンスヘッダーが荷物に貼られた注意書き、そしてレスポンスボディが実際に届く荷物の中身そのものなんだ。
まとめ
HTTPリクエストは「リクエストライン」「リクエストヘッダー」「リクエストボディ」、HTTPレスポンスは「ステータスライン」「レスポンスヘッダー」「レスポンスボディ」という、それぞれ3つの要素で構成されています。
また、リクエストには「メソッド」という種類があり、代表的なGET・POSTはパラメータの渡し方や使いどころが異なります。それぞれの詳しい内容は、以下の個別トピックでさらに学べます。
関連トピック: