HTTPメソッドとは

なんとなくフワッとしか理解していなかった HTTP メソッドについてしっかり理解するためまとめ直します。

#HTTP メソッドとは
- Web ブラウザとサーバがやり取りするときの通信の手順。
- web ページのデータをサーバとやり取りするときに使用する。
- 「Hypertext Transfer Protocol（ハイパーテキスト転送プロトコル）」の略。

#HTTP メソッドの種類
##GET メソッド
web ページからのリソースの取得を行う。
*例 : web ページの取得、画像や動画などのリソース。*

##POST メソッド
リソースに対する新規追加を行う。
*例 : SNS で投稿する時などに使用。*

##PUT メソッド
リソースに対する新規追加、更新を行う。
*例 : 掲示板でページを作成、投稿内容の編集などに使用。*

##DELETE メソッド
リソースの削除を行う。
*例 : 記事の削除、投稿の削除などに使用。*

## HEAD メソッド
リソースのヘッダ情報のみ取得する。
*例 : Content-Type　や carset など。*

#HTTP メソッドの流れ
1. ブラウザからサーバに要求(リクエスト)を送る。web ページのデータが欲しい、画像のデータが欲しいなど。
2. サーバがブラウザの要求を受け必要な処理を行う。データを探す、など。
3. サーバからブラウザに返答(レスポンス)を返す。

:::note info
HTTP は1回の処理でやり取りできる処理が1つなため、複数の情報をやり取りするときはこの動作を複数回繰り返す。
:::


#HTTP リクエストのフォーマット
##開始行
HTTP リクエストは、クライアントがサーバとのやり取りを開始するために送る。
開始行には3つの要素が含まれる。

###1. HTTP メソッド
実行するアクションを表す HTTP メソッド(GET, PUT, HEAD, など)が記述される。

###2. リクエスト対象
リクエストを送る対象を指定する。
通常はURL、HTTPメソッドによって形式が異なる。

- 最後に```?```とクエリ文字列がある絶対パス。最も一般的で GET, POST, HEAD, OPTION メソッドで使用。
```GET /background.png HTTP/1.0```
```OPTIONS /anypage.html HTTP/1.0```

- よく見るURL、主にプロキシへ接続する際に GET で使用する。
```GET http://developer.mozilla.org/en-US/docs/Web/HTTP/Messages HTTP/1.1```

- ドメイン名とポートで構成される。URL の authority の部分は authority form と呼ばれる。 CONNECT で HTTP トンネルを設定するときに限り使用される。
```CONNECT developer.mozilla.org:80 HTTP/1.1```

- アスタリスクのみ。(```*```) asterisk form と呼ばれる。OPTIONS で使用されており、サーバー全体を表す。
```OPTIONS * HTTP/1.1```

###3. HTTP バージョン
HTTP リクエストのこれ以降の部分の構造を定義しておりレスポンスでの使用を想定しているバージョンを示す役割もある。

##ヘッダー
より詳細な説明や、変更内容などを渡す。
大文字と小文字を区別せず、行の先頭から始まり直後に```:```とパラメータが続く。パラメータは次の改行、またはメッセージの最後で終了する。

- 一般ヘッダー
リクエスト及びレスポンスメッセージの両方で使用できる。内容物そのものには適用されない HTTP ヘッダー。使用されている文脈に応じて、一般ヘッダーはレスポンスヘッダー又はリクエストヘッダーのどちらかになる。

- リクエストヘッダー
クライアント自体に関する詳細情報を含むヘッダー。
指定するとリクエストを変更するもの、状況を示すもの、条件を与えるものなどがある。

- エンティティヘッダー
コンテンツの長さや MIME タイプなどのエンティティ本文に関する詳細情報。
リクエストに本文が含まれない場合このヘッダーは無い。

##本文
本文が存在しないリクエストもある。リソースを取り込むリクエストである GET, HEAD, DELETE, OPTION, は通常、本文は不要。
本文は大きく２種類ある。

- 単一リソースの本文
1個のファイルで構成され、Content-Type と Content-Length の 2 つのヘッダーで定義されます

- 複数英ソースの本文
マルチパートの本文で構成され、それぞれが異なる情報を持つ。これは主に、 HTML と関連付けられる。

#HTTP レスポンスのフォーマット
##ステータス行
例: ```HTTP/1.1 404 Not Found.```
HTTP レスポンスの開始行がステータス行と呼ばれ、以下の情報をもつ。
1. プロトコルバージョン
2. ステータスコード
2. ステータス文字列、人間が HTTP メッセージを理解するのを助けるためにステータスコードをテキストで説明する。

##ヘッダー
リクエストのヘッダーと構造は同じ。
使用できるヘッダーは多数あり、いくつかのグループに分類される。

- 一般ヘッダーは```Via```など、メッセージ全体に適用される。
- レスポンスヘッダーは Vary や Accept-Ranges など、ステータス行で伝えられないサーバーの追加情報を与える。
- エンティティヘッダーは```Content-Length```など、レスポンスの本文に適用され、通常本文がない場合は送信されない。

##本文
リクエストの最後が本文、存在しないレスポンスもある。```201 Creates```や```204 No Content```といったステータスコードのレスポンスは通常、本文がない。

本文は大きく３種類ある。

- 大きさが判明している 1 個のファイルで構成される、単一リソースの本文。 Content-Type と Content-Length の 2 つのヘッダーで定義される。
- 大きさが不明な 1 個のファイルで構成される、単一リソースの本文。 Transfer-Encoding を chunked に設定して、 chunked 形式でエンコードされる。
- 複数リソースの本文。マルチパートの本文で構成され、それぞれが異なる情報のセクションを持つ。


#参考資料
https://shiro-secret-base.com/?p=578

https://wa3.i-3-i.info/word11405.html

https://atmarkit.itmedia.co.jp/ait/articles/1508/31/news016_3.html

https://developer.mozilla.org/ja/docs/Web/HTTP/Messages

https://developer.mozilla.org/ja/docs/Glossary/HTTP_header

https://developer.mozilla.org/ja/docs/Glossary/General_header

https://developer.mozilla.org/ja/docs/Glossary/Response_header