RESTとはなにか webを支える技術を読んで
はじめに
エンジニアとして働くための予習としておすすめされた技術書を業務のあとに読んでいるのですが、なにかしらアウトプットしないと身につかないなぁという思いがありブログをしたためました。本のまとめ的な内容なのでQiitaにあげるのも違うよなぁと思った次第です。
今回は山本陽平氏著のWebを支える技術の中で解説されているRESTについてです。
こちらも参考にしました
Fielding Dissertation: CHAPTER 5: Representational State Transfer (REST)
RESTとは
REST (REpresentational State Transfer) とはアーキテクチャスタイル(システムの構造での共通した思想、構造)の一つ
RESTは次の6つのアーキテクチャスタイルを組み合わせた複合アーキテクチャスタイル
クライアント/サーバー
クライアント/サーバーとはクライアントからサーバーにリクエストを送り、サーバーはそれに対してレスポンスを返すというアーキテクチャスタイル。サーバーとクライアントがそれぞれ独立しているので、クライアントをマルチプラットフォームにできたり、逆にサーバーを増やして冗長化し、一つサーバーに問題があっても別のサーバーを使えるようすることができる。
ステートレスサーバー
サーバーがクライアントの要求をいちいち覚えていないようにするアーキテクチャスタイル。
いちいち覚えるのはクライアントが少なければ便利だが、実際は数多くのクライアント相手にしなければならないので、サーバーへの負担は大きくなってしまう。サーバーを増設してもクライアント情報の同期がという問題が発生するので、規模を大きくしにくいという問題もある。
そこでステートレスサーバーとしてクライアント側がそれぞれ要求を自分で保持していれば、サーバーはクライアントの情報を共有する必要がなくなるので、クライアントが多くなってもサーバーを増設することで対応できるようになり、規模を大きくしやすくなる。
Webを支える技術内でのハンバーガー屋さんの例がとってもわかりやすいので、気になる人はWebを支える技術買いましょう。
キャッシュ
サーバーから取得したリソースをクライアント側で保持して使い回すアーキテクチャスタイル。使い回せると通信量が減ってパフォーマンスアップ。
HTTPの機能としてのキャッシュでは有効期限を決めたり(相対的な決め方もできる、現在から何時間とか)、条件付きでクライアントに使わせたりできます。
統一インターフェース
リソースへの操作を制限してみんな同じインターフェースで扱うようにしましょうというアーキテクチャスタイル。
例えばファミコンはいろいろゲームがあるけど操作するのは基本的に同じ形状のコントローラー。ゲームはコントローラーからの入力にのみ対応できるようにすれば良い。これが人によってコントローラーの形状やボタンが全くちがう状態になってしまうと開発者側はゲームをあらゆる入力に答えるよう作らなくてはいけなくなってしまう。
この状態だとゲームは複雑になってしまうばかりか、コントローラーのことを常に考えたものになってしまい、独立性も失ってしまう。
HTTP1.1ではGETやPOSTなどの8個のメソッドという共通のコントローラーに限定することで、リソースへの操作は統一されシンプルかつ、サーバーとクライアントの独立性を高めている。
階層化システム
システムをいくつかの階層に分離するアーキテクチャスタイル。これはシステムを大きくすることへの制約であり、古いシステムをカプセル化してシステム全体への影響を最小限にするといった、システムそれぞれの独立性を高めるような構造をつくることができる。
コードオンデマンド
プログラムをクライアントにダウンロードして実行するアーキテクチャスタイル。JavaScriptやFlash等がこれに当てはまる。クライアントの簡素化、拡張性の向上がみこめるアーキテクチャスタイル。欠点として通信で何をしているのかがわかりにくくなってしまうのであくまでオプションとしての制約。
WebのアーキテクチャスタイルをRESTにするメリット
インターフェースが統一されているので互換性が保たれ、ブラウザをを統一したりしないですむ。クライアントとサーバーを分けていて、かつステートレスなので、規模を大きくすることもやりやすい。
まとめ
RESTというとリソースにCRUDで正しいURIになるようにする、という程度の認識しかなかったので勉強になりました
自分がつくるサービスもRESTという理想になるべく近づけたものを作っていきたいなぁとおもいました(感想)