【本】「Webを支える技術」のRESTについて

[株式会社diffeasy](https://diffeasy.com/)の[中尾](https://twitter.com/ksk_lack)です。
[Webを支える技術](http://amzn.asia/d/2jpeltI)という本を読んでいますが、その中の、RESTについてまとめてみました。

# Webについて
### Webってなに？
ハイパーリンクで構成されたハイパーメディア。
世界中のサーバから情報を取得可能な分散システム。

### じゃあ分散システムってなに？
複数のサーバへ処理を分散させたシステム構成。
処理を分散させる事でより高機能を実装可能。

### さらっとWebが誕生するあでの歴史
元々、特定の相手とのやり取りを前提にした分散システムはあった。しかし、インターネットが普及し、不特定多数の相手とのやり取りが必要になる。そこでWebという分散システムが誕生＆普及。
    
# RESTについて

### RESTってなに？
Webのアーキテクチャスタイル

### アーキテクチャスタイルってなに？
設計思想

### じゃあRESTってどんなアーキテクチャスタイル？
様々なアーキテクチャスタイルを組み合わせた、複合型のアーキテクチャスタイル。

**アーキテクチャスタイルを組み合わせて、制約を課していくことでRESTというアーキテクチャスタイルが出来る！！！**

# RESTを構成するアーキテクチャスタイル

### どんなアーキテクチャスタイルを組み合わせてる？

- その1　クライアント・サーバ
- その2　ステートレスサーバ
- その3　キャッシュ
- その4　統一インターフェース
- その5　階層化システム
- その6　コードオンデマンド
 
**以上6つを組み合わせたアーキテクチャスタイル。**

# その1　クライアント・サーバ

### クライアント・サーバってなに？
クライアントはサーバにリクエストを送り、サーバはそれに対してレスポンスを返す。
### クライアント・サーバのメリットは？
単一のコンピュータ上で全て処理するのでは無く、クライアントとサーバに処理を分離出来る事。
### クライアントのメリット
マルチプラットフォームに出来る。例えば、PCだけでなく、スマホやゲーム等からもアクセス可能。
### サーバのメリット
UIはクライアントにお任せ出来るので、データ処理だけに特化出来る。また、複数サーバを組み合わせて可用性をUP出来る。

# その2　ステートレスサーバ

### ステートレスってなに？
クライアントのアプリケーション状態をサーバで管理しない事。

### ステートレスのメリットは？
サーバ側の実装を簡略化出来る。

######ステートレスなやりとり

	客	:こんにちは
	店員	:いらっしゃいませ。〇〇バーガーへようこそ。
	客	:ハンバーガーセットください！
	店員	:サイドメニューは何になさいますか？
	客	:ポテトで。
	店員	:ドリンクは何になさいますか？
	客	:コーラで。
	店員	:+50円でドリンクをLサイズに出来ますがいかがですか？
	客	:Mでいいです。
	店員	:以上でよろしいですか？
	客	:はい

**ステートレスなやりとり＝私達の日常会話**

######ステートフルなやりとり

	客	:こんにちは
	店員	:いらっしゃいませ。〇〇バーガーへようこそ。
	客	:ハンバーガーセットください！
	店員	:サイドメニューは何になさいますか？
	客	:ハンバーガーセットをポテトで。
	店員	:ドリンクは何になさいますか？
	客	:ハンバーガーセットをポテトとコーラで。
	店員	:+50円でドリンクをLサイズに出来ますがいかがですか？
	客	:ハンバーガーセットをポテトとコーラ(M)で。
	店員	:以上でよろしいですか？
	客	:ハンバーガーセットをポテトとコーラ(M)で。以上。
    
**ステートフルなやりとり＝一見面倒？？**

###じゃあ改めてステートレスのメリットは？

######ステートフルのデメリット
クライアントが100台・1000台と多くなると、サーバがクライアントの状態を覚えるのがしんどくなる。
    
######ステートレスのメリット
サーバ側はクライアントの状態を覚える必要が無いため来た処理にだけ集中出来る。

######ステートレスのデメリット

- 送信するデータ量が多くなる
    - 毎回フルでデータを送るので、そりゃ多くなるよねって話。

- 認証等の、サーバに負荷が掛かる処理を繰り返す。
 - 認証とかは毎回DBへのアクセスが必要。DBへのアクセス自体思い処理。ステートレスの場合、そういった処理を繰り返す場合もある。

- 通信エラーへの対処
    - サーバ側が状態を保持しないため、通信エラー時にもう一度データを送信すると、二重送信となってしまう。これがショッピングの場合、二重注文となるの恐れがある。

# その3　キャッシュ

###キャッシュってなに？
一度取得したリソースを、期限内であればクライアント側で使い回すこと。

###キャッシュのメリットは？
サーバとクライアント間でのデータ通信を減らし、ネットワーク帯域の利用や処理時間を縮小出来る。

###キャッシュのデメリットは？
古いキャッシュを使用してしまい、情報の信頼性が下がる可能性あり。


###ざっくりどんな仕組み？
クライアントは、サーバから取得したリソースがキャッシュ可能な場合は、ローカルストレージに蓄積する。

###キャッシュ可能かはどうやって判断してるの?
ヘッダで判断している。具体的に以下3つのヘッダ。

- Pragma
- Expires
- Chache

###キャッシュの構成要素

######Pragma
パラメータ


	HTTP/1.1 200OK
	Content - Type: application/xhtml+xml; charset=utf-8
	Pragma: no - cache

特にここ↓

	Pragma: no - cache

cacheを抑制するヘッダ。公式には`no-cache`のみ指定出来る。
no-cache = そのままキャッシュNG。


######Expires
パラメータ

	HTTP/1.1 200OK
	Content - Type: application/xhtml+xml; charset=utf-8
	Expires: Thu, 11 May 2010 16:00:00 GMT
    
特にここ↓

	Expires: Thu, 11 May 2010 16:00:00 GMT

キャッシュの有効期限を示すヘッダ。クライアントがリソースにアクセスする時は、キャッシュが有効期限内か確認し、サーバに再度アクセスするのか、キャッシュを利用するのか決定する。


######Cache-Control
Pragma・Expires両方をの役割を代用出来る。

- 以下は`Pragma: no - cache`と同意。

```
	cache-Control: no - cache
```

- 以下は`Expires`と同じく期限を設定。相対的な期限を設定可能。以下は24時間キャッシュが使用可能であることを示す。

```
	cache-Control: max-age: 86400
```

###上記3つはどうやって使い分けてるの？
次の方針で使い分けをオススメ

######キャッシュさせない場合は
`Pragma`と`Cache-Control`を同時指定

######キャッシュの有効期限が明確に決まってる場合は
`Expires`を指定

######キャッシュの有効期限を相対的に指定したい場合は
`Cache-Control`の`max-age`で相対時間指定



# その4　統一インターフェース

### 統一インターフェースってなに？
URLで示したリソースに対する操作を統一した限定的なインターフェースで行う事。

### 統一インターフェースのメリットは？
インターフェースが統一されている事で、Webを利用しているシステムは同じHTTPメソッドで接続が出来る。

#その5　階層化システム

### 階層化システムってなに？
システムを階層化する事で、分離可能なアーキテクチャスタイル。
    
### 階層化システムのメリットは？
システム構成の変更等が楽。
  
システム構成ver 1）クライアント ー サーバA
システム構成ver 2）クライアント ー サーバB ー サーバA

この様に、途中サーバBに変わっても、統一インターフェースにより、同じHTTPメソッドで接続可能なため、それぞれの階層を分離して設計可能。


# その6 コードオンデマンド

### コードオンデマンドって何？
プログラムコードをサーバからダウンロードし、クライアント側でそれを実行するアーキテクチャスタイル。

### コードオンデマンドのメリットは？
クライアントのプログラムを、後から追加する事が出来る。
クライアントに元々あるプログラムだけで実行するのに比べ拡張性がある。

# まとめ
### 以下6つのアーキテクチャを組み合わせ、RESTというアーキテクチャ作成</font></small>
- その1　クライアント・サーバ
    - ユーザインタフェースと処理を分離
- その2　ステートレスサーバ
    - サーバ側でアプリケーション状態を持たない
- その3　キャッシュ
    - クライアント・サーバの通信回数を減らす
- その4　統一インターフェース
    - インタフェースを固定する
- その5　階層化システム
    - システムを階層に分離する
- その6　コードオンデマンド
    - プログラムをクライアントにダウンロードして実行する

#### 最後に
Webってどんな仕組みで動いてるの？を知るには良本だと思いました。まだまだ色んな内容が書かれてるので、読み進めていきたいです。