RESTについて簡単にまとめてみる
はじめに
webを支える技術を読み返して、RESTについて再度勉強した内容を自分なりにまとめてみます。
対象読者はこれからエンジニアになりたいと思って勉強している人、エンジニアにはなったけど雰囲気でコードを書いている私のような人を対象にしています。
RESTとは何か
- RESTはWebのアーキテクチャ(設計)のスタイルの1つ
- RESTはネットワークシステムのアーキテクチャスタイルである
- ネットワークシステムのアーキテクチャスタイルで最も有名なのはクライアント/サーバー
- webはクライアント/サーバーである
- 素のクライアント/サーバーに幾つかの制約を加えると、RESTにある
以上が書籍の中に書かれていることでした。
つまり、RESTというアーキテクチャスタイルは、元になるクライアント/サーバーというアーキテクチャスタイルがあって、それにいくつかの制約を加えていった結果、RESTというものになりますよ、ということらしいです。難しい言葉が色々出てきましたが、これを教育とかに喩えてみると
ある教育メソッドA(これは結構自由なもの)があるとして、より良い制約(例えば朝早く起きて勉強するとか)を加えていったら、「グレート教育メソッドができた」
みたいな感じで捉えておけば良さそうです。
リソースについて
- RESTにおいての重要な概念の1つにリソースがある
- リソースとはweb上に存在する名前を持ったありとあらゆる情報
と書籍には書かれています。
例えばとある猫の写真は https://upload.wikimedia.org/wikipedia/commons/0/0b/Cat_poster_1.jpg
ですし、
Googleのトップページは https://google.com
といった具合に、世界中に無数に存在するリソースは、それぞれ一意の名前を持っており、URIを使うことでリソースが表現する情報にアクセスすることができます。
これがあることで、なんらかのリソース(猫の写真やGoogleのトップページなど)にアクセスしたいなと思ったら、ブラウザにこのURIを打ち込めば、アクセスできるようになっています。
RESTはどう構成されるのか?
先ほど、RESTというアーキテクチャスタイルは、元になるクライアント/サーバーというアーキテクチャスタイルがあって、それにいくつかの制約を加えていった結果、RESTというものになる、という話を出しましたが、どうやってRESTを構成すれば良いのでしょうか?
結論を言いますと、クライアント/サーバというアーキテクチャスタイルに、以下の制約をつけることでRESTになるようです。
- クライアント/サーバ: ユーザーインターフェースと処理を分離する
- ステートレスサーバ: サーバー側でアプリケーションの状態を持たない
- キャッシュ: クライアントとサーバーの通信回数と量を減らす
- 統一インターフェース: インターフェースを固定する
- 階層化システム: システムを階層に分離する
- コードオンデマンド: プログラムをクライアントにダウンロードして実行する
....また色々難しい言葉が出てきていますね。
個々に正しい理解をする必要はあると思いますが、ざっくりいうと、クライアント/サーバーのアーキテクチャスタイルに5つの制約を加えたものがRESTであるということですね。
クライアント/サーバー + 5つの制約 = RESTということです。つまり、RESTは6つの制約を持ったアーキテクチャスタイルの呼び名の総称だということですね。
最後に、それぞれの制約について簡単に整理してみましょう。
クライアント/サーバー
- クライアントとサーバーに処理を分離する
- クライアントはユーザーインターフェースを担当し、サーバーはデータストレージを担当する
サーバーはAPIを提供し、クライアントはユーザー認証セッション、ログイン情報などを直接管理するようなイメージです。
ステートレスサーバ
- クライアントのアプリケーション状態をサーバで管理しない
- ただし、実際にはCookieを使ったセッション管理などがあり、ステートレスとは言えないwebアプリは多くある
仮にステートレスな構成になった場合は、APIサーバーは受信したリクエストだけを単純に処理すればよいので、実装が楽になります。
キャッシュ
- クライアントとサーバ間の通信量を減らすことができる
これがあることで、毎回同じファイルや画像を読み込まなくて済むようになるんで、ページやアプリの動作も高速になりやすいです。
統一インターフェース
- HTTP1.1ではGETやPOSTなどの8つのメソッドのみが定義されている
URIへの操作方法(GETとかPOSTとか)を統一することで、全体の構成がシンプルになる利点がありますね。
階層化システム
- クライアントとサーバーの間にプロキシを置いたり、ステートレスなサーバを置いたりすることで、アクセスの制限や、HTTPのインターフェースのないシステムでもブラウザと接続できるようになる
これによって、セキュリティ、負荷分散、暗号化レイヤなどを追加できる柔軟性のある構造になっているようです。
コードオンデマンド
- プログラムをサーバからダウンロードしてきて、クライアント側でそれを実行する
クライアント側にプログラムを後から追加する事ができて、元々あるプログラムだけで実行するのに比べ拡張性があるということですね。
RESTfulと呼ばれる設計は上記を満たすことが1つの特徴です。
ただ、必ずしもRESTの原則に則っていなくても良いようで、例えばステートフルではあるけど、それ以外は満たしているというアーキテクチャも許されるようです。
以上、簡単にRESTについてまとめてみました。
Discussion