前回は、Webが持つ歴史的背景について、ハイパーメディアシステムと分散システムの2つの側面からまとめた。ここでは、Webの設計思想であるRESTについて解説する。
1 アーキテクチャスタイルの重要性
RESTはWebのアーキテクチャスタイル(設計思想)である。アーキテクチャスタイルは(マクロ)アーキテクチャパターンとも呼ばれ、複数のアーキテクチャに共通する性質、様式、作法あるいは流儀をさす言葉である。アーキテクチャスタイルの例には、MVC(Model-View-Controller)やパイプ&フィルタ(Pipe and Filter)、イベントシステム(Event System)などがある。
2 アーキテクチャスタイルとしてのREST
RESTは、ネットワークシステムの代表的なアーキテクチャスタイルであるクライアント/サーバ(Client Server)から派生したものである。クライアント/サーバアーキテクチャスタイルにいくつかの制約を加えていくと、RESTになる。
アーキテクチャスタイルとアーキテクチャと実装の関係は、前のものほど抽象度が高いというものである。Webで例えると、抽象度が高い順にREST>ブラウザ、サーバ、プロキシ、HTTP、URI、HTML>Apache、Firefox、InternetExplorerとなる。
3 リソース
RESTにおける重要な概念の1つにリソース(Resource)がある。リソースとは、Web上に存在する、名前を持ったあらゆる情報である。名前を持つとは、あるリソースを他のリソースと区別して指し示すということである。リソースの例として、東京の天気予報やカイホーの「Webのアーキテクチャスタイル(設計思想) REST」のページなどがある。
リソースの名前としてのURI
リソースの名前とはURIのことである。リソースの特徴は、以下の通りである。1)リソースとはWeb上の情報である。2)世界中の無数のリソースは、それぞれURIで一意の名前を持つ。3)URIを用いることで、プログラムはリソースが表現する情報にアクセスできる。
リソースのアドレス可能性
アドレス可能性(Addressability)とは、リソースを簡単に指し示せる性質のことである。WebとURIが発明されたことで、特定のファイルの取得方法を詳しく自然言語で説明する必要がなくなったのである。
複数のURIを持つリソース
1つのリソースは複数のURIを持つことができる。例えば、「今日の東京の天気」と「2012年1月14日の東京の天気」を意味するURIは、同じリソースを指す。
リソースの表現と状態
リソースの表現(Resource Representation)とは、サーバとクライアントの間でやり取りするデータのことである。リソースは「Web上に存在する情報」という抽象的な概念であるため、それを表現する必要がある。同様に、リソースには状態がある。天気予報の例で言えば、現在の予報が「晴れ」だったとしても、数時間後には「くもり」に状態が変化しているかもしれない。
4 スタイルを組み合わせてRESTを構成する
クライアント/サーバ
Webは、クライアント/サーバというHTTPプロトコルでクライアントとサーバが通信するアーキテクチャスタイルを採用している。メリットは、単一のコンピュータ上ですべてを処理するのではなく、クライアントとサーバに分離して処理できることである。これにより、クライアントをマルチプラットフォームにすることができる。
また、ユーザインタフェースはクライアントが担当するため、サーバはデータストレージ(外部記憶装置)としての機能だけを提供すればよい。さらに、複数のサーバを組み合わせて冗長化することで、可用性を上げられる。
ステートレスサーバ
クライアント/サーバに最初に追加するアーキテクチャスタイルがステートレスサーバ(Stateless Server)である。ここでのステートレスとは、クライアントのアプリケーション状態をサーバで管理しないことを意味する。メリットは、サーバ側の実装を簡略化できることである。
クライアント/サーバにステートレス性を導入すると、アーキテクチャスタイルは「クライアント/ステートレスサーバ」(Client Stateless Server, CSS)になる。
キャッシュ
次のアーキテクチャスタイルはキャッシュ(Cache)である。キャッシュとは、リソースの鮮度に基づいて、一度取得したリソースをクライアント側で使い回す方式である。メリットは、ネットワーク帯域の利用や処理時間を縮小し、より効率的に処理できることである。
キャッシュの追加したアーキテクチャスタイルは、「クライアント/キャッシュ/ステートレスサーバ」(Client Cache Stateless Server, C$SS)と呼ぶ。
統一インタフェース
次のアーキテクチャスタイルは統一インタフェース(Uniform Interface)である。統一インタフェースとは、URIで指し示したリソースに対する操作を、統一した限定的なインタフェースで行うアーキテクチャスタイルのことである。例えば、HTTP 1.1ではGETやPOSTなど8個のメソッドだけが定義されており、通常はこれ以上メソッドが増えない。この制約があることで、全体のアーキテクチャがシンプルになる。
統一インタフェースを追加したアーキテクチャスタイルを「統一/クライアント/キャッシュ/ステートレスサーバ」(Uniform Client Cache Stateless Server, UC$SS)と呼ぶ。
階層化システム
階層化システム(Layered System)とは、システムをいくつかの階層に分離するアーキテクチャスタイルのことである。例えば、Webサービスにおいてプロキシ(Proxy)を設置してアクセス制限を行ったとしても、インタフェースがHTTPで統一しているため、システム全体を階層化することができる。
階層化システムを追加したアーキテクチャスタイルを「統一/階層化/クライアント/キャッシュ/ステートレスサーバ」(Uniform Layered Client Cache Stateless Server, ULC$SS)と呼ぶ。
コードオンデマンド
コードオンデマンド(Code on Demand)とは、プログラムコードをサーバからダウンロードし、クライアント側でそれを実行するアーキテクチャスタイルである。例えば、JavaScriptやFlash、Javaアプレットなどである。メリットは、クライアントを後から拡張できることである。デメリットは、ネットワーク通信におけるプロトコルの可視性が低下することである。
コードオンデマンドを追加したアーキテクチャスタイルを「統一/階層化/コードオンデマンド/クライアント/キャッシュ/ステートレスサーバ」(Uniform Layered Code on Demand Client Cache Stateless Server, ULCODC$SS)と呼ぶ。
REST = ULCODC$SS
クライアント/サーバにコードオンデマンドまでを追加した複合アーキテクチャスタイルは「ULCODC$SS」という覚えにくい名前である。このアーキテクチャスタイルにFieldingはRESTという名前を付けた。RESTとはつまり、以下の6つを組み合わせたアーキテクチャスタイルのことである。
- クライアント/サーバ:ユーザインタフェースと処理を分離する
- ステートレスサーバ :サーバ側でアプリケーション状態を持たない
- キャッシュ :クライアントとサーバの通信回数と量を減らす
- 統一インタフェース :インタフェースを固定する
- 階層化システム :システムを階層に分離する
- コードオンデマンド :プログラムをクライアントにダウンロードして実行する
5 RESTの2つの側面
RESTとハイパーメディア
RESTとハイパーメディアの関係は、接続性(Connectedness)で表される。接続性とは、RESTの基幹をなす思想で、リソースをリンクで接続することで1つのアプリケーションを構成するという考え方である。Webが持つリンクをたどるという特徴を、RESTでは「アプリケーション状態エンジンとしてのハイパーメディア」(Hypermedia as the engine of application state)という。つまり、ハイパーメディアのリンクをたどる作業がRESTに影響を与えているのである。
RESTと分散システム
RESTと分散システムとの関係は、Webが世界規模の分散システムとして成功したかということにかかわる。それは、1)リンクをたどってアプリケーション状態を遷移することで全体として性能劣化が抑えられる、2)統一インタフェースによってインタフェースが固定されているため互換性の問題は発生しない、という特徴によってもたらされている。
6 RESTの意義
RESTはWeb全体のアーキテクチャスタイルである。WebはRESTという分散ネットワークシステムのための理論があったからこそ、ここまで成功したといえる。
最後に
RESTとは、クライアント/サーバ、ステートレスサーバ、キャッシュ、統一インタフェース、階層化システム、コードオンデマンドという6つを組み合わせたアーキテクチャスタイルである。いかにハイパーメディアフォーマットをRESTfulに使うか、そしてWebサービスやWeb APIをいかにRESTfulに設計するかが重要である。
次回は、リソースを統一的に識別するIDであるURIの仕様について説明する。
![]() |