1.序(HTTPとは何か)
HTTPは、Hypertext Transfer Protocolの略称です。Hypertextという語は「複数の文書(テキスト)を相互に関連付け、結び付ける仕組み」のことで、今日ではありふれた概念となっています。(ウェブサイト上で公開されるほぼ全てのページは、aタグ等により実装された他ページとのリンクを有するため、Hypertextです。)
従って、HTTPは、「HypertextをTransfer(転送 = 送受信)する際のProtocol(取り決め)」を意味します。
下記に例示する通り、送受信される内容自体はただの文字列ですが、この取り決め(HTTP)に従ったフォーマットで通信が行われることで、送信側・受信側の間の通信が齟齬なく可能になります。
※URLの先頭に記述される「http://」は、プロトコルの宣言で、「Httpに則った通信を行う」ということを送信先に通達します。
2.HTTPリクエストの構成
HTTPリクエストは、以下の3つの要素で構成される。
- リクエスト行
- ヘッダーフィールド
- ボディ
ヘッダーフィールド、ボディは省略可能。
ヘッダーフィールドとボディの間は、空行を1行挟む。
2-1.リクエスト行
メソッド、URI、HTTPバージョンの3つの要素から構成され、それぞれスペースで区切られる。
POST /index.html HTTP/1.0
2-2.ヘッダーフィールド
ヘッダの各要素は、
フィールド名: 内容
の形式で構成される。
Accept: image/gif, image/jpeg, */*
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive
リクエストヘッダの種類については、下記参照
https://triple-underscore.github.io/RFC7231-ja.html#section-5
2-3.ボディ
主に、POST通信時のパラメータが記述される。
hoge=piyo&yoshiki=xjapan
3.HTTPレスポンスの構成
HTTPレスポンスは、以下の3つの要素で構成される。
- ステータス行
- ヘッダーフィールド
- ボディ
3-1.ステータス行
3桁の数字で構成され、リクエストの結果をクライアントに通知する。
大まかに、下記の通り分類される。
100番台「情報」
200番台「成功」
300番台「リダイレクト」
400番台「クライアントエラー」
500番台「サーバエラー」
詳細については下記参照
https://triple-underscore.github.io/RFC7231-ja.html#section-6
3-2.ヘッダーフィールド
リクエスト同様、ヘッダの各要素は、
フィールド名: 内容
の形式で構成される。
詳細については下記参照
https://triple-underscore.github.io/RFC7231-ja.html#section-7
alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
cache-control: private, max-age=0
content-encoding: br
content-type: text/html; charset=UTF-8
date: Thu, 23 Aug 2018 15:37:28 GMT
expires: -1
server: gws
status: 200
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block
3-3.ボディ
リクエストに対する、サーバー応答内容の本文。
webサーバーへのリクエストに対するレスポンスの場合、HTML形式のテキストデータが記述される。
4.実際にレスポンスを見てみる
curlが一番簡単なので、下記コマンドでgoogle.co.jpにリクエストしてみよう。
curl -i google.co.jp
上記の結果を見ると、google.co.jp が www.google.co.jp にリダイレクトされていることがわかる。
(ステータスコードが301、ヘッダにLocationの記述がある)
curlで叩いた場合、単に返ってきたレスポンスが文字列として表示されるだけ。
実体としては文字列のやり取りが行われているだけ、ということがわかる。
ウェブブラウザは、これらの記述を「解釈」して、様々な動作を行っている。
「解釈」が可能なのは、HTTPによって通信内容と意味が定義されているためである。
5.参考
https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol
https://qiita.com/shuntaro_tamura/items/ae55b99deb9e2a170754
https://ja.wikipedia.org/wiki/Hypertext_Transfer_Protocol
http://www.tohoho-web.com/ex/http.htm
https://qiita.com/yasuhiroki/items/a569d3371a66e365316f