HTTPの理解

# HTTP
Webサイトの閲覧は、WebブラウザがWebサーバーに要求を送り、Webサーバーはその要求に対して応答を返す、というやりとりが行われている。このやりとりの手順ややりとりを決めているのが**HTTP（HyperText Transfer Protocol）**である。
## クライアントとサーバー間のやりとり
Webサイトを閲覧する際は、大きく分けて５つのステップがある。

1. Webブラウザのアドレス蘭にURLを入力、あるいはWebサイト内のリンクをクリック
2. URLやリンクにもとづいてWebサーバーにデータを要求
3. Webサーバは要求内容を解析
4. 解析結果から、要求データをWebブラウザへ応答
5. Webブラウザは、受け取ったデータを解析し、Webページとして表示

HTTPが利用されるのは、２と４のステップである。
## HTTPメッセージ
WebブラウザとWebサーバーでやりとりする際、「**HTTPメッセージ**」が利用される。HTTPメッセージは、Webブラウザからの要求である「**HTTPリクエスト**」と、Webサーバーからの応答である「**HTTPレスポンス**」の２種類に分けられる。
### HTTPリクエスト
HTTPリクエストは、以下の３つに分けることができる。

1. リクエスト行
2. メッセージヘッダー
3. メッセージボディ
![834EEB6B-9B0C-443E-A94B-7C02B8D486FF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/de6e2936-8120-5e5b-eee8-93a592ce394a.png)

１は、Webサーバーに対してどのような処理をして欲しいかというリクエストの要求内容を伝える
２は、Webブラウザの種類やバージョン、対応するデータ形式など付加的な情報を伝える
３は、Webページ内のフォームなどに入力したテキストをWebサーバーに送る目的で使用される
### HTTPレスポンス
HTTPレスポンスはHTTPリクエストと同様の構成であるが、内容が一部異なる。

１では、Webブラウザのリクエストに対してWebサーバー内での処理の結果を伝える
２では、Webサーバーの種類や、送信するデータ形式など付加的な情報を伝える
３では、リクエストされたHTMLなどのデータが格納される

HTMLのデータを受け取ったWebブラウザは内容を解析し、受け取ったHTML内に画像などのリンクが存在する場合は、サイドWebサーバーへHTTPリクエストを送信する。リクエストとレスポンスを繰り返し行うことで、Webサイトを閲覧できる。
## ステータスコード
HTTPレスポンス内には、**ステータスコード**とよばれるHTTPリクエストに対するWebサーバーでの処理結果が含まれている。ステータスコードは３桁の数字からなり、処理内容によって１００番台から５００番台までの５つに分類されている。

* １００番台：
  HTTPリクエストを処理中であることの通知。Webサーバーがデータを受け入れ可能かどうかを確認するための一次応答（情報）
* ２００番台：
  HTTPリクエストに対して、正常に処理した場合の通知（成功）
* ３００番台：
  HTTPリクエストに対して、転送処理などのWebブラウザで追加の処理が必要な通知。WebサイトのURLが変更されている場合など（転送）
* ４００番台：
  Webブラウザのエラーの通知。リクエストされたHTMLファイルがWebサーバーに存在しない場合（**404 Not Found**）など（クライアントエラー）
* ５００番台：
  Webサーバーのエラーの通知。Webサーバーがエラーによって応答できない場合や、高負荷状態の場合（サーバーエラー）

### 代表的なステータスコード

| 番号  | 文字列                   | 内容                                         |
| --- | --------------------- | ------------------------------------------- |
| 100 | continue              | リクエストが継続中                                   |
| 200 | OK                    | リクエストが正常に受理                                 |
| 301 | Moved Permanently     | リクエストしたコンテンツが移動                             |
| 302 | Found                 | リクエストしたコンテンツが一時的に移動（別の場所で発見）                |
| 304 | Not Modified          | リクエストしたコンテンツが未更新。Webブラウザに一時保存されたコンテンツが表示される |
| 400 | Bad Request           | リクエストが不正                                    |
| 404 | Not Found             | リクエストしたコンテンツが未検出                            |
| 500 | Internal Server Error | リクエスト処理中にサーバー内部でエラーが発生                      |
| 503 | Service Unavailable   | アクセス集中やメンテナンスにより一時的に処理不可能                   |

## メッセージヘッダー
HTTPリクエストとHTTPレスポンスはいずれも「**メッセージヘッダー**」を利用することで、HTTPメッセージに関する詳細な情報を送信できる。メッセージヘッダーは複数の「**ヘッダーフィールド**」とよばれる行から成り立ち、それぞれのヘッダーフィールドはフィールド名、その後にコロン（:）と１文字分の空白、そしてフィールド値で構成される。
ヘッダーフィールドはそれぞれが持つ情報の種類によって、以下の４種類に分けることができる。
![846A59C2-4629-48CC-BDBB-212CA0D2B013_4_5005_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999125/cc4ccfbb-6dd2-5701-3442-3812dbad42c3.jpeg)


* 一般ヘッダーフィールド：
  リクエストとレスポンスの両方に含まれる。

| 名前         | 内容                            |
| ---------- | ----------------------------- |
| Connection | リクエスト後はTCPコネクションを切断など、接続状態の通知 |
| Date       | HTTPメッセージの作成日                 |
| Upgrade    | HTTPのバージョンアップデートの要求           |

* リクエストヘッダーフィールド：
  リクエストのみに含まれるヘッダーフィールドで、代表的なものは「User-Agent」。サーバーはUser-Agentを参照してスマートフォンからの接続であれば、スマートフォン向けのWebサイトを表示するといった処理を行える。

| 名前         | 内容                           |
| ---------- | ---------------------------- |
| Host       | リクエスト先のサーバー名                 |
| Referer    | 直前に訪れていたWebページのURL           |
| User-Agent | Webブラウザの固有情報（プロダクト名、バージョンなど） |

「Referer」の綴りは正しくは「Referrer」だが、技術仕様決める際に誤って登録されたものの名残である。

* レスポンスヘッダーフィールド：
  レスポンスのみに含まれるヘッダーフィールドで、代表的なものはサーバー機能を提供するプロダクト情報を示す「Server」。

| 名前       | 内容                           |
| -------- | ---------------------------- |
| Location | リダイレクト先のWebページの情報            |
| Server   | Webサーバーの固有情報（プロダクト名、バージョンなど） |

* エンティティヘッダーフィールド：
  リクエストとレスポンスの両方に含まれ、代表的なものはデータの種類を示す「Content-Type」。一般ヘッダーがHTTPメッセージ全体に対しての負荷情報を示すものであるのに対し、これはメッセージボディに含まれるデータの付加情報を示す。

| 名前               | 内容                  |
| ---------------- | ------------------- |
| Allow            | 利用可能なHTTPメソッドの一覧    |
| Content-Encoding | コンテンツのエンコード方式       |
| Content-Language | コンテンツの使用言語          |
| Content-Length   | コンテンツのサイズ（byte）     |
| Content-Type     | コンテンツの種類（テキスト、画像など） |
| Expires          | コンテンツの有効期限          |
| Last-Modified    | コンテンツの最終更新時刻        |

また、ヘッダーフィールドは独自に定義したものを利用することも可能である。
## HTTPメソッド
[過去記事](https://qiita.com/super-kiricub/items/8aa0966843ef9b98e7c7)を参照


# 参考
[イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/gp/product/B06XNMMC9S/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)