改めて「REST」について学ぶ

RESTについて学ぶと、「何いってんだこいつ、そんなの当たり前のことだろ?」となります
REST自体は2000年頃に提唱された概念で、当時は斬新だったらしい
いま当たり前だと思えるのは、それだけ優れていて、普及しきっているということです

RESTとは?

RESTはREpresentational State Transferのことで、
分散型システムにおける設計原則群という意味になります
分散型というのは、ネットとかWEBのことです(今どきのブロックチェーンやweb3のはなしではないことに注意)
つまりRESTとは、WEBシステムを設計する基本的なルールです

RESTfulとは?

RESTに則って設計されたシステムのことです

REST APIとは?

RESTfulなAPIのこと
つまりRESTのルールに則って設計されているAPIのことです

RESTの6原則

RESTの原則は4原則だったり、6原則だったりするけど、ここでは6原則とします
6原則は以下です

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

一つずつ説明します

クライアント・サーバー

クライアントサイドとサーバーサイドを明確に分離する
UIはクライアント側で、制御して
データはサーバーサイドで制御する
クライアントサイドがトリガーで、サーバーサイドは受け身

ステートレス

サーバーサイドはクライアントの状態を保持せず、必要な情報を明記して送信する
つまり、「前に言ってたアレだよ、アレ」というものを認めない

キャッシュ制御

クライアント側で、HTTPレスポンスをキャッシュできる
ここで言うキャッシュはHTTPレスポンスのことであり
cssとかjsとか画像などをキャッシュで溜め込めることとはまた違う

統一インターフェイス

統一インターフェイスはさらに4つに分けられる

リソースの識別
名前がつけられて、サーバーサイドに保持できるデータのことをリソースという
URIを使って、リソースを識別できること

表現を用いたリソース操作
リソースの断面とは、クライアントが必要としているリソースの一部のことで、 断面を使って、リソースをCRUD操作できること
動画を特定の秒から再生できるとか、
一度書き込んだ文章を修正できることを指す

自己記述メッセージ
メッセージ内容が何であるかをヘッダーに記述すること

HATEOAS
レスポンスに、前のページや次のページのハイパーンクを含めること
現在あんまり使われてない

階層化システム

WEBとAPとDBを明確に分ける
コンポーネントを作って使い回す

コードオンデマンド

1回サービスをリリースした後、
サーバーサイドを更新することで、
クライアントサイドのコードを更新できること

REST APIの設計レベル

REST APIには設計レベルがあって

レベル0 HTTPを使っている

レベル1 リソースの概念を導入している

レベル2 HTTPの動詞が導入されている

レベル3 HATEOASが導入されている

HATEOASは普及しなかったので、実際ではレベル2を目指すべきであり、 RailsやLaravelなどのモダンフレームワークでアプリを作ると、自然とレベル2を満たしたことになる

CRUD操作におけるURIとHTTPメソッドの具体的な定義例

以下movieというリソースで、実際にテーブルを作ってみる

URI HTTPメソッド コントローラとアクション 意味
/movies get movies#index 動画の一覧を読み取る
/movies/new get movies#new 新規投稿フォームを開く
/movies post movies#create 新規投稿を保存させる
/movies/:id/ get movies#show 動画の詳細ページを開く
/movies/:id/edit get movies#edit 動画を編集する
/movies/:id put/patch movies#update 動画の編集を保存する
/movies/:id delete movies#destroy 動画を削除する

まとめ

RESTは2000年頃に提唱され、現在では十分普及している概念なので、
勉強するとあたり前のことばかりでした。
Railsでアプリを開発していると、自然とRESTに沿った開発になるけど、
一度意識して学ぶことで、解像度度が高くなり、理解がより進んだと感じた。

RailsやLaravelなどのアプリで開発するときはCRUDの定義をちゃんと覚えましょう。 一度覚えてしまえば、ずっと使えます。