HTTPリクエスト、HTTPレスポンスとは



## そもそもHTTPとは

HTTP（HyperText Transfer Protocol）は、インターネット上で情報をやり取りするためのプロトコル（通信規約）の一つです。
特に、WebブラウザとWebサーバーの間での通信に使われています。

## 基本的な流れ

1. **ユーザーがブラウザのアドレスバーにURLを入力してEnterを押す**
   - 例: `http://www.example.com`

2. **ブラウザはURLに基づいてHTTPリクエストを作成し、Webサーバーに送信する**
   - HTTPリクエストには、要求するリソースの情報や通信の詳細などが含まれます。

3. **Webサーバーがリクエストを受け取り、必要な情報やファイルを探してレスポンスを作成**

4. **WebサーバーがHTTPレスポンスをブラウザに送り返す**
   - HTTPレスポンスには、要求されたデータやステータスコード、ヘッダー情報などが含まれます。

5. **ブラウザがHTTPレスポンスを受け取り、画面に表示する**

## HTTPリクエスト

リクエストには主に以下の情報が含まれます：

- **メソッド**
    - 何をしたいのかを示す動詞（例：GET, POST, PUT, DELETE）
- **URL**
    -  どのリソースに対してアクションを行いたいのか
- **ヘッダー**:
    - クライアントやリクエストの追加情報を提供する（例：User-Agent, Accept-Language）
- **ボディ**
    - データ送信を伴うリクエスト（例：フォームの入力データ）で使用される

### HTTPリクエスト例

1. **GETリクエスト**（Webページの内容を要求）

```bash
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
```

この例では、`www.example.com`の`index.html`というページの内容を要求しています。

2. **POSTリクエスト**（データをサーバーに送信）

```bash
POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Content-Type: application/x-www-form-urlencoded
Content-Length: 27

name=John&Doe&email=john@example.com
```

この例では、フォームのデータ（nameとemail）をサーバーに送信しています。


### HTTPリクエストの具体的要素説明

1. **GET, POST, PUT, DELETE, ...など**
 これは**HTTPメソッド**または**HTTP動詞**と呼ばれるものです。
   - **GET**
       - サーバーから情報を取得するためのリクエスト。
   - **POST**
       -  サーバーに情報を送信するためのリクエスト。通常、フォームデータの送信やリソースの作成に使用されます。
   - **PUT**
       - サーバーのリソースを更新または作成するためのリクエスト。
   - **DELETE**
       -  サーバーのリソースを削除するためのリクエスト。

2. **Host**
   - **ホストヘッダー**は、リクエストが送信されるサーバーのドメイン名またはIPアドレスを示します。
   - 例: `Host: www.example.com`

3. **User-Agent**
   - ユーザーエージェントヘッダーは、リクエストを行っているクライアント（通常はウェブブラウザ）の情報を示します。
   - 例: `User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)`

4. **Accept**
   - Acceptヘッダーは、クライアントが受け入れることができるコンテンツのタイプ（MIMEタイプ）を示します。
   - 例: `Accept: text/html` はクライアントがHTMLコンテンツの受け入れを示しています。

5. **Accept-Language**
   - Accept-Languageヘッダーは、クライアントが理解することができる言語を示します。
   - 例: `Accept-Language: en-US,en;q=0.5` は、クライアントが英語（US）を優先的に、次に英語を受け入れることを示しています。

これらのヘッダーはHTTPリクエストの一部としてサーバーに送信されます。サーバーはこれらのヘッダーを使用して、適切なレスポンスをクライアントに返すことができます。例えば、`Accept-Language`ヘッダーを使用して、ユーザーの言語に合わせたコンテンツを返すことができます。


6. **Content-Type**
    - `Content-Type`はHTTPヘッダーの一部で、リクエストボディやレスポンスボディのメディアタイプを指定します。これは、送信されるコンテンツの種類を伝えるためのもので、サーバーやクライアントが適切にコンテンツを解釈できるようにします。
    - 例:
        - `Content-Type: text/html`: ボディにはHTMLが含まれている。
        - `Content-Type: application/json`: ボディにはJSONフォーマットのデータが含まれている。
        - `Content-Type: application/x-www-form-urlencoded`: ボディはフォームデータをエンコードした形式です。

2. **Content-Length**
    - `Content-Length`ヘッダーは、リクエストやレスポンスのボディのサイズをバイト単位で示すものです。このヘッダーは、ボディの長さを明示的に知らせることで、受信側がコンテンツの終わりを認識するのを助けるために使用されます。

3. **first_name=John&last_name=Doe&email=john@example.com**
    - これはフォームデータの例で、キーと値のペアで表現されるデータを示しています。このデータは、通常、`application/x-www-form-urlencoded`という形式でエンコードされてHTTPリクエストに添付されます。

このように、HTTPリクエストの各部分は、クライアントとサーバーの間での通信を円滑に進めるための情報を提供しています。

## HTTPレスポンス

レスポンスには以下の情報が含まれます：

- **ステータスコード**
    - リクエストの結果を示す番号（例：200は成功、404はページが見つからない）
- **ヘッダー**
    -  サーバーやレスポンスの追加情報を提供する
- **ボディ**
    - 実際のデータやコンテンツ（例：HTML, JSON, 画像）

### HTTPレスポンス例

1. **200 OKレスポンス**（成功）

```php
HTTP/1.1 200 OK
Date: Mon, 23 May 2022 22:38:34 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 08 Jan 2022 23:11:55 GMT
Content-Type: text/html
Content-Length: 438

<html>
<head>
  <title>An Example Page</title>
</head>
<body>
  Hello World, this is an example page.
</body>
</html>
```

このレスポンスでは、サーバーは200 OKというステータスコードで応答し、HTMLの内容を返しています。

2. **404 Not Foundレスポンス**（ページが見つからない）

```php
HTTP/1.1 404 Not Found
Date: Mon, 23 May 2022 22:38:34 GMT
Server: Apache/2.4.1 (Unix)
Content-Type: text/html
Content-Length: 204

<html>
<head>
  <title>404 Not Found</title>
</head>
<body>
  Sorry, the requested page was not found.
</body>
</html>
```

このレスポンスでは、サーバーは404 Not Foundというステータスコードで応答し、ページが見つからないことを示すHTMLの内容を返しています。

### HTTPレスポンスの具体的要素説明

1. **HTTP (ステータスライン)**
    - HTTPレスポンスの最初の行はステータスラインとして知られています。これにはHTTPのバージョン、ステータスコード（例: 200, 404, 500など）、およびそのステータスコードに関連する短い文書（例: OK, Not Found, Internal Server Error）が含まれます。
    - 例: `HTTP/1.1 200 OK`

2. **Date**
    - `Date`ヘッダーは、レスポンスが生成された日時を示します。これは、レスポンスの鮮度を識別するのに役立ちます。
    - 例: `Date: Tue, 20 Sep 2023 08:12:31 GMT`

3. **Server**
    - `Server`ヘッダーは、レスポンスを生成したウェブサーバーの情報を提供します。これはサーバーの名前やバージョンを示す場合があります。
    - 例: `Server: Apache/2.4.28 (Unix)`

4. **Last-Modified**
    - `Last-Modified`ヘッダーは、リソースが最後に変更された日時を示します。これはキャッシングや再検証の際に役立ちます。
    - 例: `Last-Modified: Sat, 18 Sep 2023 15:45:00 GMT`

5. **Content-Type**
    - `Content-Type`ヘッダーは、レスポンスボディのメディアタイプを指定します。これは、クライアントがコンテンツをどのように解釈するべきかを知るためのものです。
    - 例: 
        - `Content-Type: text/html`: ボディにはHTMLが含まれている。
        - `Content-Type: application/json`: ボディにはJSONフォーマットのデータが含まれている。

6. **Content-Length**
    - `Content-Length`ヘッダーは、レスポンスボディの長さ（バイト単位）を示します。これはクライアントがボディの終わりを認識するのを助けるためのものです。
    - 例: `Content-Length: 3487`

これらのヘッダーは、HTTPレスポンスの一部として、サーバーからクライアントへの応答に関する重要な情報を提供するためのものです。

## まとめ

HTTPは、クライアント（主にWebブラウザ）とサーバーの間の通信を可能にするプロトコルです。
ユーザーがWebページを要求すると、ブラウザはHTTPリクエストをサーバーに送信し、サーバーはHTTPレスポンスとして情報を返します。これにより、ユーザーはインターネット上の情報をブラウズできるようになります。