HTTPメッセージについて簡単なまとめ

# HTTPとは？
**HTTP**(Hypertext Transfer Protocol)とは、サーバとブラウザの間で、情報をやりとりするためのプロトコル(通信ルール)

# HTTPSとは？
**HTTPS**(Hypertext Transfer Protocol Secure)は、HTTPで通信を安全に行うための仕組み。
**HTTP**と**SSL/TLS**を組み合わせた通信の総称で、通信路を暗号化してクライアントとサーバ間でやりとりするデータを保護し、盗聴を防ぐ目的で利用されている。
**HTTP**と**HTTPS**の違いは通信が暗号化されていないか暗号化されているかの違いで、現在は基本的に**HTTPS**が使用されている。

# HTTPメッセージとは？
**HTTPメッセージ**は、サーバーとクライアントがデータを交換する手段。
クライアントが送信してサーバーにアクションを起こさせる**リクエスト**と、サーバーの回答である**レスポンス**の、**2種類**のメッセージがある。

## HTTPメッセージの構造
HTTPメッセージは、スタートライン、ヘッダ、ボディで構成されています。

![httpメッセージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/c0944c13-ea96-7725-1b79-7a27fd6b08c7.png)

### ■スタートライン
スタートラインは、**リクエストライン**と**ステータスライン**の２種類があります。

#### リクエストライン
リクエストメッセージの１行目を**リクエストライン**と呼び、メソッド、リクエストURI、プロトコルバージョンで構成されています。

![スクリーンショット 2022-05-28 15.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/db2778de-21ca-9225-5861-98dfdd2b8bcf.png)

#### ステータスライン
レスポンスメッセージの１行目を**ステータスライン**と呼び、プロトコルバージョン、ステータスコード、テキストフレーズから構成されています。
※http2.0以降はプロトコルバージョン、ステータスコードの２つで構成されている

![スクリーンショット 2022-05-28 15.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/47225618-8437-f8e1-cbd4-713fc6292228.png)

### ■ヘッダ
ヘッダにはメッセージのメタデータが記述されています。
１つのメッセージは複数のヘッダを持つことができ、「**名前:値**」というkey-valueのような構成をしています。

![スクリーンショット 2022-05-28 15.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/d6520707-bcb8-9e84-4c27-a142a9cc8bb5.png)

### ■ボディ
ボディには、そのメッセージを表す**本質的な情報**が入ります。
つまり、サーバー側に渡したいデータや、サーバー側から返却されるデータなどが入っています。

![スクリーンショット 2022-05-29 10.14.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/11a9711e-3fe0-c5d9-67b0-c4e593492df7.png)



# HTTPのステートレス性
HTTPは**ステートレス**なプロトコルとして設計されている。

## ステートレスとは？
システム(サーバー)が現在の状態を表すデータを**保持しない**こと。
同じ入力(リクエスト)に対する出力(レスポンス)は常に同じ。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/c98c7185-9915-393d-62d5-5c4c9d94d4e5.png">

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/50e0d1d6-3f67-4d91-a1be-f2fd5cc6c521.png">


<font color="green">■**利点**</font>
クライアントからのリクエストに単純に答えるだけなので、クライアントが増えた場合はサーバーを増やすだけで良い。

<font color="red">■**欠点**</font>
クライアント側から送信するデータが多くなる。
認証など、サーバーに負荷がかかる処理を繰り返す場合がある。

## ステートフルとは？
システム(サーバー)が現在の状態を表すデータを**保持している**こと。
同じ入力(リクエスト)でも、保持しているデータによって出力(レスポンス)が変わる。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/c98c7185-9915-393d-62d5-5c4c9d94d4e5.png">

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/f4754d22-5610-f154-45b9-f7a3782b6274.png">

<font color="green">■**利点**</font>
以前の操作を保持・反映できるため、すべての操作をスムーズに完結させられることができる。

<font color="red">■**欠点**</font>
データを保持する必要があるため、多数の人が共用するようなシステムでは負荷が重くなる。
どのサーバーでも同じ状態を保持させないといけないため、クライアントが増えた場合にスケールアウトさせにくい。


# 9つのHTTPメソッド
HTTPには、クライアントが行いたい処理をサーバに伝えるために９つのメソッドが定義されています。
この中でもよく使われるメソッドは、**GET**、**POST**、**PUT**、**DELETE**の４つで、**CRUD**という性質を満たすためのものです。

## GET
指定したURIの情報を取得するメソッド。
最も利用頻度の高いメソッドで、Webページの取得や、画像、映像の取得などで使用される。

## POST
3つの役割があるメソッド。
1. 子リソースの作成
2. リソースへのデータの追加
3. 他のメソッドでは対応できない処理(何らかの理由で他のメソッドで対応できない処理を**POST**で行うことがある)

## PUT
1. リソースの更新(対象リソースの現在の表現全体を変更)
2. リソースの作成

## DELETE
リソースの削除に使用する。

## HEAD
リソースの**ヘッダ**だけを取得するメソッド。
**GET**と似ているが、**HEAD**のレスポンスにはボディが含まれない。

## OPTIONS
対象リソースがサポートしているメソッドの一覧を返す。

## TRACE
対象リソースへのパスに沿ってメッセージのループバックテストを実行する。

## CONNECT
対象リソースで識別されるサーバーとの間にトンネルを確立させる。

## PATCH
リソースを部分的に変更するために使用する。

# ステータスコードについて
ステータスコードは、レスポンスの１行目に記述されている3桁の数値。リクエストに対する結果を示している。

## 分類と意味
### 1xx : 処理中
処理が継続していることを示す。

### 2xx : 成功
リクエストが成功したことを示す。

### 3xx : リダイレクト
他のリソースへのリダイレクトを示す。

### 4xx : クライアントエラー
クライアントのエラーを示す。原因はクライアントのリクエストにある。

### 5xx : サーバエラー
サーバエラーを示す。原因はサーバ側にある。

# 参考にさせていただいた書籍

https://gihyo.jp/book/2010/978-4-7741-4204-3