HTTPのリクエストとレスポンスについてアウトプットします。
HTTPとは
HTTPとはウェブブラウザとウェブサーバー間で情報を送受信するためのプロトコル
OSI参照モデルのアプリケーション層に位置する。
HTTPの基本構造
HTTP通信はリクエストとレスポンスの2つのフェーズで構成されています
リクエスト(Request)
クライアント(ブラウザやAPIクライアント)がサーバーに送信するデータ
リクエストの構造
リクエストは3つのパートで構成されます
- リクエストライン
- ヘッダー
- ボディ
1. リクエストライン
役割
クライアントがサーバーに「何をしたいのか」を伝えるための基本的な情報を提供
- メソッド(例: GET, POST, PUT, DELETE)
- URL(リソースのパス)
- HTTPバージョン(例: HTTP/1.1)
GET /index.html HTTP/1.1
2. ヘッダー
役割
ヘッダーは、リクエストに関する追加情報や指示を提供する部分。リクエストを正しく処理するために必要なメタ情報を含む。
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/json
3. ボディ
役割
リクエストの「実際のデータ」を含む部分。
特にPOSTやPUTリクエストで使用され、サーバーにデータを送信する際に必要
主に POST や PUT リクエストで送信されるデータ。
JSONやフォームデータなどが含まれます。
例:
{
"username": "user1",
"password": "pass123"
}
レスポンス(Response)
HTTPレスポンスは、サーバーがクライアント(ブラウザやAPIクライアント)からのリクエストに対して返すデータです。リクエストと同様に、レスポンスも以下の構造を持っています。
HTTPレスポンスの基本構造
HTTPレスポンスは以下の3つの部分で構成されています:
- ステータスライン
- ヘッダー
- ボディ
1. ステータスライン
ステータスラインには、レスポンスの基本的な情報が記載されています。以下の3つの要素で構成されます
- HTTPバージョン
例:HTTP/1.1、HTTP/2 - ステータスコード
レスポンスの結果を示す3桁の数値 (例:200,404など) - ステータスメッセージ
ステータスコードに対応する説明(例:OK、Not Found)
例
HTTP/1.1 200 OK
2. ヘッダー
レスポンスに関する追加情報を含む部分です。「キー: 値」の形式で記載される。
役割
ヘッダーは、レスポンスに関するメタ情報(データの属性や通信条件など)を提供。
ヘッダーはボディの内容を補足し、クライアントに具体的な指示を伝える。
なぜ必要か
クライアントがボディを正しく解釈するための情報を提供する。
通信の効率性を高める
- ステータスラインやヘッダーを解析するだけで、処理の可否を判断
- データサイズをヘッダーなどで知らせることでメモリを効率よく確保できる
- Cache-Control ヘッダーを利用して、クライアントがリソースを再利用可能かどうかを判断
主なヘッダー例
Content-Type: レスポンスのデータ形式を指定(例:text/html、application/json)
Content-Length: レスポンスデータのサイズ(バイト単位)
Date: レスポンスが送信された日時
Set-Cookie: クライアントにクッキーを保存させる指示
Cache-Control: キャッシュの制御方法を指定
例:
Content-Type: text/html
Content-Length: 348
Date: Tue, 05 Dec 2024 12:00:00 GMT
3. ボディ
役割
ボディは、レスポンスの実際のデータ(リソース)を提供する部分。
HTMLページ、画像、JSON形式のAPIレスポンスなど、クライアントが必要とするコンテンツがここに含まれる。
なぜ必要か
リクエストされたリソース(データやコンテンツ)をクライアントに送るため
ボディの例
<!DOCTYPE html>
<html>
<head><title>Example</title></head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
{
"username": "user1",
"status": "active"
}
3つに分けている理由
責務の分離
ステータスラインは結果の要約を伝える。
ヘッダーは通信やデータ処理に必要な情報を提供。
ボディは実際のデータを送信。 各部分が異なる役割を担うことで、複雑な処理がシンプルになります。
柔軟性の向上
ヘッダーだけで重要な情報(ステータスコード、リソースの場所など)をクライアントに伝えることが可能。
必要に応じてボディを省略(例:204 No Content)できる。
効率性
ヘッダーを利用して、クライアントが事前にデータ形式やサイズを把握することで、無駄な処理を減らせる。
参考