REST? RESTful? REST API? って何なの?
こんにちは!今回の投稿では、ウェブで広く使われているRESTについて調べてみたいと思います。
REST
はロイ・フィルディング(Roy Fielding)という人が2000年に博士論文で紹介したものです。
REST
はRepresentation State Transferの略で、ハイパーメディア
システムのためのソフトウェアアーキテクチャの一形式です。
ハイパーメディア(Hyper Media)とは?
知らない単語が出てきましたね? ハイパーメディア
とは何でしょうか?
ハイパーメディアとは、テキスト、図形、アニメーション、ビデオ画像など複数の情報をノードとリンクで有機的につなげたネットワークの網構造を指します。
リンク機能を利用して情報を有機的に結び付け、順次引き出す方式で関連情報を対話的に引き出せることが特徴です!情報がリンクを通じて接続されていることが核心です!
それでRESTって何?
REST
は資源(Resource
)を資源の名前(資源の表現:Representation
)で区別して資源の状態(State
)を送受信するすべてを意味します。
こう言うと非常に難しいですよね?もう少し簡単に表現してみます。
資源とは、私たちが普段インターネットサーフィンをしながら見るものです。テキスト、動画、画像などサービスが提供するすべてを資源と表現できます。
資源の表現とは何でしょうか?資源に名前を付けたものと見なせます。
インターネットであるデータを見るためには名前を付ける必要があります。
次のような情報を表現したいときのことを考えてみましょう。
- これはライオンの画像です。でもネットワークがどうやってDBにあるライオン画像を出力できるのでしょうか?

- 次の図のように、ライオン画像をインターネットブラウザが資源の名前を通じて呼び出します。
- 写真から見た通り、正確には資源を含むリンクを通じてその資源を要求することになります。
このように資源の名前を明示
し、その名前を通じて資源を送受信すること
を資源の表現
と呼ぶのです :)
しかしインターネットで行われる作業は、ライオンの画像を得る(GET
)作業だけではないでしょう?
RESTメソッド
RESTはHTTPプロトコルを通じて複数の要求を処理できるように、主に4つのメソッド
を提供します。
GET
: 情報を取得することに重点を置いたプロトコルです。皆さんがNAVERにログインするとプロファイルに自身の情報が表示されますよね?NAVERはログインしてメインページをロードする過程でユーザーのプロファイル情報を要求(Request)し、サービスはその情報を返します。POST
: 情報を生成することに重点を置いたプロトコルです。もし皆さんが会員登録をすると、ウェブブラウザに記録されたユーザー情報がDBに反映されるためにPOSTメソッドを通じてサービスに伝達されます。PUT
: 情報を修正することに重点を置いたプロトコルです。NAVERでプロファイルを修正すると、このプロトコルを通じて修正された情報をサービスに伝達します。DELETE
: 情報を削除することに重点を置いたプロトコルです。会員脱退、投稿削除などDBのレコードを削除するためにサービスに要求する際に使用します。
それでは実際のデータはどうやって送受信するの?(資源の状態:State)
REST
の概念において、核心は資源を送受信する方式にあります。
実際のデータはXML
やJSON
フォーマットを通じてファイルを送受信するのですが、例えば先ほどのライオン写真はこのようにJSON
で表現することができます。
{
"pic_name": "lion",
"link": "https://cdn.example.com/img/lion.png"
}
▲ 例のJSON
<?xml version="1.0"?>
<pic>
<pic_name>lion</pic_name>
<link>"https://cdn.example.com/img/lion.png"</link>
</pic>
▲ 例のXML
このように資源の状態を含んだ値をユーザーに返し、クライアントはその応答を通じて適切なタグ(例:img
タグ)内にライオン画像リンクを与え、ユーザーにようやくライオンの情報を表示することができます。
RESTの6つの制約
開発者は次の条件に従って、REST
のプロトコルを実装できます。
- インターフェイスの一貫性(Uniform Interface): インターフェイスは一貫して分離されているべきという原則です。
- 特定のフレームワークやプログラムに依存しない形式で、
REST
に従って実装されたサービスの場合、HTTP
プロトコルを通じて資源を送受信できるべきです。
- 特定のフレームワークやプログラムに依存しない形式で、
- ステートレス(Stateless): 各要求間にクライアントのコンテキストがサーバーに保存されてはいけないという原則です。
- これは以前の要求が現在の要求に絶対に影響を与えてはならないという原則を持っています。
- 例としてログインを挙げることができます。
- REST以前と、多くのサービスでは現在もユーザー認証情報をセッションなどの形式でサーバーに保存して管理しています。
- ただし、完全にRESTで実装されたサービスなら、認証情報はユーザー(クライアント)が直接管理すべきです。
- 一般的にはログイン情報を
JWT Token
のような形式で暗号化してヘッダーに保存し、認証が必要な要求ごとにヘッダーに認証情報を含めて送信する形式でログインを実装します。
- これは以前の要求が現在の要求に絶対に影響を与えてはならないという原則を持っています。
- キャッシュ可能(Cacheable): RESTはウェブ標準
HTTP
プロトコルをそのまま使用するという点で大きな利点があります。- つまり、
HTTP
のキャッシュ
機能を使用できるのです。キャッシュ
は、与えられたリソースのコピーを保存しておき、要求時にそれを提供する技術を指します。 - もしすべての資源を要求するたびにサーバーに要求すると、サーバーには大きな負担がかかります。
- ですから、すでに一度受け取ったファイルや、要求の場合、
HTTP
プロトコルはこれをキャッシュファイルとして保存しておき、すでにある資源の要求の場合は別途サーバーに要求せずにその資源を返すことをします。
- つまり、
- 階層化(Layered System): クライアントは直接サービスに要求しません。サービスはユーザーのためにAPIサーバーを準備すべきであり、クライアントはその
API
サーバーを通じて資源を要求(Request)し、応答(Response)を受けることができます。- よく
Spring
で言われるController
、Django
ではView
がクライアントとコミュニケーションする代表的な部分です。 - 追加的に
API Server
はビジネスロジックのみを実行し、フロントで認証、ロードバランシングなどの追加機能を実装することができます。
- 追加的に
- よく
- Code On Demand: クライアントはサーバーからスクリプトを受け取って実行しなければならないという制限事項です。ただし、必ず満たす必要はありません。
- クライアント - サーバー構造(Server-Client): 資源を保持する側が
Server
、要求する側がClient
になります。サーバー
:API
提供、ビジネスロジック処理およびストレージを担当します。クライアント
: サーバーに必要な資源を要求し、さらにユーザー認証やセッションなどを管理、責任を持ちます。
REST API
REST APIとは、前述のREST
アーキテクチャを基にしてクライアントが要求を送り、使用できるように実装したインターフェースを意味します。
私が以前プロジェクトをしながら実装したAPI
の例をご覧ください!

上のようにAPI
は要求URI、URIを通じて応答できる資源の状態(JSON
)、要求メソッド
などを明示する必要があります。クライアント開発者はそのAPI
を見てJSON
やXML
内部のデータを適切にユーザーに表示できるようにクライアントを構成します。
RESTful
RESTful
とは、REST
アーキテクチャを実装したウェブサービスを指すために用いられる用語です。特定のウェブサービスがREST API
を実装していれば、そのサービスはRESTful
であると言えます。
目的
誰が見ても直感的に理解でき、使用しやすいAPIを作成することを目的としています。
結論
- 今回はウェブで広く使用されているアーキテクチャである
REST
とREST API
、RESTful
について調べました。 - 説明が不十分だったり間違った点があれば、いつでもご指摘ください。即反映いたします!