RESTとは何なのか


背景

RESTというものが何なのかいまいち実態がつかめずにいたので腰を据えて調べてみたらわかってきたのでまとめたかった。

RESTはWebのアーキテクチャスタイル

まず前提としてRESTというのは具体的なものではなく思想です。ここが曖昧になっており今まで理解ができていませんでした。正確にいうとアーキテクチャスタイルと呼びます。直訳で設計思想ですが、同じような思想としてフレームワークでのMVCなどがこれに当たります。

RESTを構成する要素

そしてRESTというのは複数のアーキテクチャスタイルを組み合わせて作られている複合アーキテクチャスタイルです。RESTを構成する要素はいかの通りです。

  • クライアント/サーバー
  • ステートレスサーバー
  • キャッシュ
  • 統一インターフェース
  • 階層化システム
  • コードオンデマンド

これら6つの設計思想を複合してRESTは成り立っています。この制約をしっかり守っているWebサービスやWeb APIなどがRESTfulと呼ばれています。
1つ1つの要素を見ていきましょう。

クライアント/サーバー

WebはHTTPというプロトコルでクライアント(ブラウザなど)からリクエストを送り、それに対してサーバーがレスポンスを返します。
この分業によってサーバーはデータストレージ、クライアントはUIに集中できる構造となります。

ステートレスサーバー

クライアントのアプリケーション状態をサーバーが管理しない状態のことを指します。これにより計算機リソースを確保することができるのと実装を簡略化することができます。
とはいえ、私たちはWebサービスでログインなどができます。これはcookieを使用し、サーバーにてセッションを管理して認証することで実現しています。
つまりログインなどの認証システムは設計思想から外れているわけです。
ログイン状態を保持するため、あえてこの思想を捨てているのを理解するのがミソです。

キャッシュ

キャッシュは一度取得したリソース(Webに存在する情報)をクライアント側で使いまわすことを指します。この利点は通信を減らすことでネットワーク帯域の利用や処理時間を減らして効率的に処理ができるようにしています。要は早くブラウザが表示されるということです。

統一インターフェース

URI(URLも指す)に対する操作を限定して利用します。GETやPOSTなどの8個のメソッドのことを指します。そしてこれ以上にメソッドを拡張しないことを約束することでアーキテクチャがシンプルになります。
つまりこの一見厳しいようにも見える制約があるがゆえに現在の様々なクライアント(スマホなども含む)やサーバーの構成に一役買っているわけです。

階層化システム

インターフェースの統一をすることで階層化が可能となります。サーバーを複数台設置しロードバランサーで負荷分散をしたり、プロキシサーバーを用意しアクセス制限を行ったりすることが容易に可能となります。これはインターフェースを統一することで別のサーバーやプロキシでも同じインターフェースで接続できることが保証されているためです。

コードオンデマンド

プログラムコードをサーバーからダウンロードしそれをクライアントで利用できます。JavaScriptがこれにあたります。

Roy Fielding

これらの要素を合わせてもともとはULCODC\$SS($Uniform$ $Layered$ $Code$ $on$ $Demand$ $Client$ $Cache$ $Stateless$ $Server$)という名前でした。キャッシュはお金の意味の発音と同じことからダラー\$で表現しています。
2000年当時カリフォルニア大学の大学院生だったRoy FieldingはこのアーキテクチャスタイルをREST($Representational$ $State$ $Transfer$)と名付けて博士論文として発表しました。
のちにAmazonやGoogleがこのRESTを採用したAPIを発表し、この設計思想は定着していきます。

所感

1つずつ要素を見てみると使ったことのある機能ばかりで身近にこの設計思想が存在しているのが実感できました。これからはRESTという単語が出てきてもすんなり入ってきそうです。