Railsのリクエストがルーティングにアクセスするまでの流れについて

# 概要
Railsアプリケーションでのリクエストからルーティングにアクセスするまでをまとめてみました。
# Railsのルーティングとは
##### 役割
『クライアントからのリクエストを判断し、どのプログラムに処理を渡すのか』を決める役割を担っている部分になります。
##### 処理に必要な情報
『リクエストURI』 と 『HTTPメソッド』 です。
##### つまり...
この2つの情報を持ったリクエストがクライアントから送信されていることになります。
## 今回のゴール
リクエストは
###### ・ 『どうやってRailsアプリにアクセスしているのか?』
###### ・ 『アクセス時にどのような情報を持っているのか?』
について、知ることです。
## <1>  どうやってRailsアプリにアクセスしているのか?
#### 結論
クライアントはRailsアプリのあるWebサーバの所在を表す **URI** をもとにアクセスしている。
### URIとは
一般的にURLという意味で使われている
例)```http://sample.com/samples```　といったものです。
#### このURIを分解してすると、このように分けられる

　　・  ```http:```  =>  **スキーム**

　　・  ```sample.com```  =>  **ホスト**

　　・  ```samples```  =>  **パス**
#### スキームとは・・・
『どんな手段で通信するのか』を明示的に示している部分になります。
つまり今回の場合だと『 **HTTP通信**をしますよ 』ということを示しています。
###### HTTPとは・・・
Hyper Text Transfer Protocolの略で、
Webページを構成するHTMLなどのコンテンツの送受信に用いられる**通信プロトコル**です。

また、SSL/TLSプロトコル(暗号化と認証の機能がある)を用いて行われるHTTP通信を行うことをHTTPS通信(https:)と呼び、HTTP通信よりも安全です。

###### 通信プロトコルとは・・・
『ネットワーク上でデータ通信するためのルールをまとめたもの』です。
よく例えで使われているのが、言語やマナーでした。
つまり、人間の世界でも「郷に入れば郷に従え」ということわざがあるように
コンピュータの世界にもデータをスムーズにやりとりするために細かい取り決めがあり
それを通信プロトコルと呼びます。

また、通信プロトコルはOSI参照モデルをもとに７つの階層に分けることによって
それぞれの階層で行われる通信機能を定義しています。

ちなみに、HTTPは第７階層のアプリケーション層に区分されています。
#### ホストとは・・・
『どこのサーバにアクセスするのか』を明示的に示している部分になります。
今回の場合だと、**DNS**というサービスを使って
『 ```sample.com```のサーバにアクセスしますよ 』ということを示しています。
###### DNSとは・・・
Domain Name Systemの略で人間が覚えにくいIPアドレスにドメイン名を割り当て、覚えやすい情報にするシステムです。

例) **127.0.12.1**(IPアドレス)　<=>　**sample.com**(ドメイン名)
#### パスとは・・・
『どのファイルをの情報が欲しいのか』を明示的に示している部分になります。
今回の場合だと『 ```samples```ファイルを下さいね 』ということを示してします。
### <1> まとめ
・WebブラウザがWebサーバと通信する時は、HTTP通信を使用する。
・クライアントはURIをもとにアクセスしている。
・URIは３つの部分に分けられる。(スキーム・ホスト・パス)

## <2> アクセス時にどのような情報を持っているのか
#### 結論
**HTTPリクエスト**というクライアントからの情報です。
### HTTPリクエストとは・・・
HTTP通信をする際にWebブラウザからWebサーバへ送信される**『リクエストライン』**・**『ヘッダー』**・**『ボディ』**の3つで構成されるリクエストになります。


```:HTTPリクエストのイメージ
  GET /samples HTTP/1.1  　// リクエストライン
  Host: sample.com　　　　　/* ヘッダー
  Accept-Language: ja   　 */
                          // 空白行
  q=test&test=%E6%A4%9C   // ボディ
```
また、反対にWebサーバからWebブラウザ送信される通信を『HTTPレスポンス』といい
『HTTPリクエスト』と『HTTPレスポンス』をワンセットでやりとりすることで
Webアプリケーションが出来ています。
### リクエストラインとは・・・
Webサーバ内のどのリソースにどんな操作をするかを表した部分で
**『HTTPメソッド』**・**『リクエストURI』**・**『HTTPバージョン』**の３つの要素を１行で表したものです。

```
 <HTTPメソッド>     <リクエストURI>     <HTTPバージョン>
     GET           /samples         HTTP/1.1
```
###### HTTPメソッドとは・・・
Webサーバに対して『やって欲しい操作』を明示的に示している部分になります。
種類は8つありますが、基本的にRailsで使われるのは4種類になります。
 
| メソッド | 操作の内容 |
|:-:|:-:|
| GET      | 指定されたURIのリソースを取得する。少量のデータを送信する。|
| POST     | 大量のデータや機密性のあるデータを送信する。|
| PUT/PATCH| 指定したURIにリソースを保存する。|
| DELETE   | 指定したURIのリソースを削除する。|
###### リクエストURIとは・・・
リクエストの対象となるデータを指す情報のことです。

###### HTTPバージョンとは・・・
Webブラウザがサポートするバージョンのことです。
今回の例だとバージョンが『1.1』という意味になります。

### ヘッダーとは・・・
リクエストの詳細情報を表した部分になります。
唯一の必須のヘッダーは『Host』で、ホスト名を指定して『どのWebサーバへのリクエストか』を明示的に示します。

また、ヘッダーの種類はたくさんあり、Webブラウザ側でサポートするデータのタイプ、データの圧縮方法、ブラウザの種類などの情報があります。

```:ヘッダーイメージ
  Host: sample.com   // リクエスト先のサーバ
  User-Agent:        // サポートするブラウザの種類
  Accept:            // ブラウザが受信可能なデータ形式
  Accept-Encoding:   // ブラウザのデータの圧縮方法
  Accept-Language:   // ブラウザが受信可能な言語
  ...
```
### ボディとは
Webサーバにデータを送る時に使用する部分になります。
HTTPメソッドがPOSTとPUTの時に使用され、ヘッダーの下に空白行を一行入れ、その下に記述されます。
また、使用されない場合は省略されます。

### <2> まとめ
・Webサーバーは、クライアントからの情報をHTTPリクエストで受信する。
・HTTPリクエストは３つの部分に分けられる。(リクエストライン・ヘッダー・ボディ)
・Railsのルーティングに必要な情報は、リクエストラインの中に入っている。

以上になります。