クライアント/サーバ(RESTの基本)
webはHTTPというプロトコルでクライアントとサーバが通信するクライアント/サーバのアーキテクチャスタイルを採用しています。下図参照
クライアント/サーバの利点は、単一のコンピュータ上ですべての処理をするのではなく、
クライアントとサーバの二つに分離して処理すること
これにより、クライアントをマルチプラットフォームにすることができる。
例えば、現在のwebはPCだけでなく携帯電話だけでなくゲーム機からもアクセスすることができる。
クライアントはUIを担当し、
サーバはデータストレージを担当する。
→複数のサーバを組み合わせることで可用性を広げることができる。
クライアントサーバの設計モデルに諸々を追加してRESTを構成する
ここでいう諸々とは、
- ステートレスサーバ
- キャッシュ
- 統一インターフェース
- 階層化システム
- コードオンデマンド
ステートレスサーバ
ステートレスは、「クライアントのアプリケーション状態をサーバで管理しない」こと
アプリケーションの状態を管理しないことの利点は、サーバ側の実装を簡略化できること
逆にHTTPをステートフルにするのが、Cookie。
これはRESTの理論的には間違いであるが、Cookieがやめるべきであるわけではない。
ステートレスサーバが加わると、
クライアント/ステートレスサーバとなる。
毎回リクエスト通りの出力が返ってくるということだ。
キャッシュ
キャッシュは**「リソースの鮮度に基づいて一度取得したリソースをクライアント側で使い回す」**ということ
キャッシュの利点は、「サーバとクライアントの間の通信を減らすことで、ネットワーク帯域の利用や処理時間を縮小しより効率的に処理できること」
キャッシュを追加すると、
クライアント/キャッシュ/ステートレスサーバとなる。
統一インターフェース
統一インターフェースは**「URIで指し示したリソースに対する操作を統一した限定的なインターフェースで行うこと」**
インターフェースに制限を書けることで、全体のアーキテクチャスタイルがとてもシンプルになり、
インターフェースを統一することで、クライアントとサーバの実装の独立性が向上する。
統一インターフェースを追加すると、
統一/クライアント/キャッシュ/ステートレスサーバとなる。
階層化システム
統一インターフェースの利点の一つに、階層化しやすいという点がある。
例えば、サーバとクライアントの間にロードバランサを設置して負荷分散したり、プロキシを設置してアクセスを制限したりする。
クライアントからするとサーバもプロキシも同じインターフェースで接続できるので接続先がサーバからプロキシに代わったことを意識する必要はありません。
これはサーバやプロキシなど各コンポーネント間のインターフェースをHTTPで統一しているから実現することができる。
このようにシステムをいくつかに改装に分離するアーキテクチャスタイルを階層化システム(Layered System)という。
階層化システムを追加すると、
統一/階層化/クライアント/キャッシュ/ステートレスサーバとなる。
コードオンデマンド
コードオンデマンドは、プログラムコードをサーバからダウンロードしクライアント側でそれを実行するアーキテクチャスタイル。
例えば、JavascriptやFlashやJavaアプレットなどがこれに該当する。
コードオンデマンドの利点は、クライアントを後から拡張することができること。
クライアントプログラムにあらかじめ用意された機能だけでなく新しい機能を追加していける。
欠点は、ネットワーク通信におけるプロトコルの可視性が低下すること。
HTTPというアプリケーションプロトコルに従って通信している場合は通信の意味やアクセスするリソースは明白ですが、コードオンデマンドを用いてプログラムをダウンロードしクライアント側で実行してしまうと、アプリケーションの可視性が低下する。
コードオンデマンドを追加すると、
統一/階層化/コードオンデマンド/クライアント/キャッシュ/ステートレスサーバとなる。
この統一/階層化/コードオンデマンド/クライアント/キャッシュ/ステートレスサーバこそが、
RESTなのです。