HTTP メッセージ構造
HTTPはクライアント/サーバー(C/S)アーキテクチャモデルに基づき、信頼性のある接続を介して情報を交換する、ステートレスなリクエスト/レスポンスプロトコルです。
HTTPメッセージはクライアントとサーバー間の通信の基盤であり、一連のテキスト行で構成され、特定のフォーマットと構造に従います。
HTTPメッセージは、リクエストメッセージとレスポンスメッセージの2つのタイプに分類されます。
HTTPクライアントは、アプリケーション(Webブラウザやその他の任意のクライアント)であり、サーバーに接続して、サーバーに対して1つまたは複数のHTTPリクエストを送信することを目的とします。
HTTPサーバーも同様にアプリケーション(通常はNginx、Apacheサーバー、IISサーバーなどのWebサービス)であり、クライアントからのリクエストを受信し、クライアントにHTTPレスポンスデータを送信します。

クライアントリクエストメッセージ
クライアントがサーバーに送信するHTTPリクエストのリクエストメッセージは、次の形式で構成されます:リクエストライン(request line)、リクエストヘッダー(header)、空行、リクエストデータの4つの部分で構成され、下図にリクエストメッセージの一般的な形式を示します。

-
リクエスト行(Request Line):
- メソッド:GET、POST、PUT、DELETEなどがあり、実行する操作を指定します。
- リクエスト URI(Uniform Resource Identifier):リクエストするリソースのパスで、通常はホスト名、ポート番号(デフォルトでない場合)、パス、クエリ文字列を含みます。
- HTTP バージョン:HTTP/1.1 や HTTP/2 など。
リクエスト行の形式の例:
GET /index.html HTTP/1.1 -
リクエストヘッダー(Request Headers):
- クライアント環境情報、リクエストボディのサイズ(存在する場合)、クライアントがサポートする圧縮タイプなどを含みます。
- 一般的なリクエストヘッダーには、
Host、User-Agent、Accept、Accept-Encoding、Content-Lengthなどがあります。
-
空行:
- リクエストヘッダーとリクエストボディの間の区切り文字であり、リクエストヘッダーの終わりを示します。
-
リクエストボディ(オプション):
- 一部のタイプのHTTPリクエスト(POSTやPUTなど)では、リクエストボディにはサーバーに送信するデータが含まれます。
サーバーレスポンスメッセージ
HTTPレスポンスも4つの部分で構成されています:ステータス行、メッセージヘッダー、空行、レスポンスボディです。

-
ステータス行(Status Line):
- HTTP バージョン:リクエストメッセージのバージョンと一致します。
- ステータスコード:3桁の数字で、リクエストの処理結果を示します。200は成功、404はリソースが見つからないことを示します。
- ステータスメッセージ:ステータスコードの簡単な説明です。
ステータス行の形式の例:
HTTP/1.1 200 OK -
レスポンスヘッダー(Response Headers):
- サーバー環境情報、レスポンスボディのサイズ、サーバーがサポートする圧縮タイプなどを含みます。
- 一般的なレスポンスヘッダーには、
Content-Type、Content-Length、Server、Set-Cookieなどがあります。
-
空行:
- レスポンスヘッダーとレスポンスボディの間の区切り文字であり、レスポンスヘッダーの終わりを示します。
-
レスポンスボディ(オプション):
- サーバーが返すデータを含みます。例えば、リクエストしたWebページのコンテンツ、画像、JSONデータなどです。
例
以下に、GETを使用してデータを渡す典型的な例を示します。
クライアントリクエスト:
GET /index.html HTTP/1.1 Host: www.example.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate Connection: keep-alive
サーバーレスポンス:
HTTP/1.1 200 OK
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<title>Example Page</title>
</head>
<body>
<h1>Hello, World!</h1>
<!-- The rest of the HTML content -->
</body>
</html>
実際のアプリケーションでは、HTTPメッセージにはより多くのヘッダーフィールドが含まれる場合があり、リクエストボディとレスポンスボディのサイズは転送するデータによって変わります。
その他の拡張