REST(Representational State Transfer)とは?
Wikipediaでは、以下のように紹介されています。
RESTは、APIの定義に使用されるアーキテクチャスタイルであり、同時にウェブのような分散ハイパーメディアシステムのためのソフトウェアアーキテクチャのスタイルのひとつでもある。この語はHTTPプロトコル規格の主要著者の一人であるロイ・フィールディング(英語版)がウェブについて書いた2000年の博士論文で初めて現れ、ネットワーキングコミュニティの中ですぐに広く使われることになった。
※ロイ・フィールディング氏が書いた論文は>>こちら<<
難しいですね。簡単に纏めると、以下です。
RESTは、Representational State Transferの略で、Webサービス設計モデルの一つということです。
HTTPプロトコルを最大限活用できる設計モデルだと言われており、WebサービスのURIにHTTPメソッドでアクセスすることにより、データ・リソースの送受信を行うモデルです。
現在では、以下のようなWebサービスにRESTが使用されています。(知ってました?)
- Facebook、Twitter
- Google (検索)、Amazon、Yahoo
- LinkedIn、MySpace
- など
Webサービスを提供するサーバーとクライアントとのインターフェースを「REST API」と言い、RESTの設計原則に基づいて提供されるサービスのことを 「RESTful サービス」と言ったりします。
RESTの設計原則
RESTの設計原則は、以下の4つに集約することができます。
- アドレス指定可能なリソース
- 統一されたインターフェイス
- ステートレス
- 表現指向とハイパーリンク
それぞれ、詳しく見ていきましょう。
【原則①】アドレス指定可能なリソース
RESTでは、HTTPサーバーとクライアントでやり取りするデータを全て「リソース」という考え方で表現します。そのリソースは、URIを通じてリソースを一意に指し示すことができることをRESTの原則としています。REST APIのバージョン、どのようなリソースなのか等が一目でわかるように、URIを設計することがポイントです。
例えば、以下のようなURIの場合、どのような情報が取得できるかが一目で分かると思います。
REST APIの例
https://progzakki.sanachan.com/api/v2/author/info
【原則②】統一されたインターフェイス
サーバーが提供するリソースの作成、取得、更新、削除といった操作は、全てHTTPメソッドを利用することを原則としています。作成「POST」、取得「GET」、更新「PUT」、削除「DELETE」のHTTPメソッドを使用します。
例えば、以下のようなREST APIは、RESTの原則を守っていないことになります。
REST APIの悪い例
https://progzakki.sanachan.com/api/v2/author/info/get
https://progzakki.sanachan.com/api/v2/author/info/update
また、クライアントからの要求に対する処理結果は、HTTPステータスコードを使用することを原則としています。クライアントからの要求がHTTPメソッドなので、処理結果をHTTPステータスコードで返すのは自然ですね。
以下に、代表的なHTTPステータスコードをまとめておきます。
コード | 状態 | 説明 |
200 | OK | 要求が正常に処理された |
201 | CREATED | 要求が正常に処理され、リソースが新規に生成された |
400 | BAD REQUEST | サーバーが理解できない無効な要求 |
401 | UNAUTHORIZED | 要求したリソースの操作は認証が必要 |
403 | FORBIDDED | 要求が拒否された |
404 | NOT FOUND | 要求されたリソースはサーバーに存在しない |
500 | INTERNAL SERVER ERROR | 要求を処理中にサーバーでエラーが発生した |
【原則③】ステートレス
ステートレスとは、「状態が無いこと」です。RESTでは、基本的にクライアント側で状態を保持し、サーバーとのやり取りで必要な情報は、全てURIとHTTPメソッドで表現することを原則としています。すなわち、HTTPサーバー側では、クライアントの状態を保持するためにセッションスコープを用いないことを意味しています。
【原則④】表現指向とハイパーリンク
リソース情報を応答する際、関連する情報はハイパーリンクとして情報に含めることができることをRESTの原則としています。そのため、リソースの表現は JSON、XML形式の場合が多いです。
RESTで設計するメリットとデメリット
メリット
- 原則①②により、シンプルで一貫性のあるAPIを実現(開発者が直感的に理解できる)
- 原則③により、サーバー側システムが複雑にならず、負荷も少ない
- 原則④により、他のサービスとの連携やクライアントとの互換性が高い
デメリット
- 原則④により、テキストベースで送受信を行う場合が多く、ネットワーク帯域を食う
- RESTは設計の自由が高い反面、APIの動作仕様で認識ずれが発生しやすい
- 認証を要する場合は、RESTの原則から逸脱(セッション管理)してしまう
RESTfulサービスの設計手順
- ドメインとデータを定義する(要素定義)
- データをグルーピングする(リソース化)
- リソースをURIへマッピングする(リソース配置)
- リソースの表現方法を定義する(レスポンス・フォーマット定義)
- リソース間のデータをリンクする(連携)
- HTTPメソッド(操作)とマッピングするためのユースケースを検討する