HTTP メッセージ
https://developer.mozilla.org/ja/docs/Web/HTTP/Messages
サーバ と クライアント がデータを交換する手段
要は HTTP リクエスト と HTTP レスポンス の両方を指す言葉
HTTP/1.1 以前のバージョンでは コネクション 内で人間にとっても読みやすい形式のまま送信される
一方、HTTP/2 からは HTTP フレーム に分割することで、最適化 や パフォーマンス 向上を実現している
大きく 3 つの要素で構成されている
1. スタートライン
スタートラインは、メッセージがリクエストかレスポンスかによって更に 2 種類に分かれる
1. リクエストライン(HTTP リクエストのみ)
以下の 3 つの情報を含む
1. どんな方法で リソース にアクセスするのか(HTTP メソッド)
2. どのリソースにアクセスするか
3. HTTP のどのバージョンを使うか
RFC 7230 3.1.1 Request Line では、以下のように定義されている
request-line = method SP request-target SP HTTP-version CRLF
SP はスペース 1 文字、CRLF は 改行文字 を表す
e.g. http://example.com/index.html にアクセスする場合
GET /index.html HTTP/1.1
2. ステータスライン(HTTP レスポンスのみ)
以下の 3 つの情報を含む
1. HTTP のどのバージョンを使うか
2. アクセスの結果(ステータスコード)
3. 結果の説明(理由フレーズ)
e.g. OK や Not Found など
RFC 7230 で以下のように記載されているように、クライアントは理由フェーズによって挙動を変えてはいけない
A client SHOULD ignore the reason-phrase content.
RFC 7230 3.1.2 Status Line では、以下のように定義されている
status-line = HTTP-version SP status-code SP reason-phrase CRLF
e.g. http://example.com/index.html へのアクセスが成功した場合
HTTP/1.1 200 OK
2. HTTP ヘッダ
スタートラインの 2 行目以降、改行だけの行までの部分
1 つのヘッダは : で区切られた Key-Value のペアで構成される
RFC 7230 3.2 Header Fields では、以下のように定義されている
header-field = field-name ":" OWS field-value OWS
任意の項目だが、HTTP/1.1 からは Host ヘッダをリクエストに含める必要がある
これは、1 つの IP アドレス と ポート番号 で複数の Web サイトを運用している場合、Host ヘッダの値によってアクセスしたい Web サイトを判断するためである
順番に決まりはないが、RFC 7230 3.2.2 Field Order では、サーバ側の実装がメッセージを処理しない時期をできるだけ早く決定できるように、以下のような 制御データを含むヘッダを最初に送信する ことを推奨している
HTTP リクエストにおける Host
HTTP レスポンスにおける Date
e.g. http://example.com/index.html にアクセスする場合
code:_
GET /index.html HTTP/1.1
Host: example.com
3. ボディ
HTTP ヘッダ後の改行以降
リクエスト
GET リクエストの場合、RFC で定められていないため空であることが多い
一方、POST や PUT リクエストでは更新内容が含まれる
レスポンス
GET レスポンスの場合、以下のような HTML などのリソース内容が含まれる
code:_
HTTP/1.1 200 OK
...
<!DOCTYPE html>
<html>
...
</html>