REST? RESTful? REST API? って何なの?

REST? RESTful? REST API? って何なの?

2022年2月28日

こんにちは!今回の投稿では、ウェブで広く使われているRESTについて調べてみたいと思います。 RESTはロイ・フィルディング(Roy Fielding)という人が2000年に博士論文で紹介したものです。

RESTはRepresentation State Transferの略で、ハイパーメディアシステムのためのソフトウェアアーキテクチャの一形式です。

ハイパーメディア(Hyper Media)とは?

知らない単語が出てきましたね? ハイパーメディアとは何でしょうか?
ハイパーメディアとは、テキスト、図形、アニメーション、ビデオ画像など複数の情報をノードとリンクで有機的につなげたネットワークの網構造を指します。

リンク機能を利用して情報を有機的に結び付け、順次引き出す方式で関連情報を対話的に引き出せることが特徴です!情報がリンクを通じて接続されていることが核心です!

それでRESTって何?

RESTは資源(Resource)を資源の名前(資源の表現:Representation)で区別して資源の状態(State)を送受信するすべてを意味します。

こう言うと非常に難しいですよね?もう少し簡単に表現してみます。

image

資源とは、私たちが普段インターネットサーフィンをしながら見るものです。テキスト、動画、画像などサービスが提供するすべてを資源と表現できます。

資源の表現とは何でしょうか?資源に名前を付けたものと見なせます。

インターネットであるデータを見るためには名前を付ける必要があります。

次のような情報を表現したいときのことを考えてみましょう。

image

  • これはライオンの画像です。でもネットワークがどうやってDBにあるライオン画像を出力できるのでしょうか?
image
  • 次の図のように、ライオン画像をインターネットブラウザが資源の名前を通じて呼び出します。
  • 写真から見た通り、正確には資源を含むリンクを通じてその資源を要求することになります。

このように資源の名前を明示し、その名前を通じて資源を送受信すること資源の表現と呼ぶのです :)

しかしインターネットで行われる作業は、ライオンの画像を得る(GET)作業だけではないでしょう?

RESTメソッド

RESTはHTTPプロトコルを通じて複数の要求を処理できるように、主に4つのメソッドを提供します。

  1. GET: 情報を取得することに重点を置いたプロトコルです。皆さんがNAVERにログインするとプロファイルに自身の情報が表示されますよね?NAVERはログインしてメインページをロードする過程でユーザーのプロファイル情報を要求(Request)し、サービスはその情報を返します。
  2. POST: 情報を生成することに重点を置いたプロトコルです。もし皆さんが会員登録をすると、ウェブブラウザに記録されたユーザー情報がDBに反映されるためにPOSTメソッドを通じてサービスに伝達されます。
  3. PUT: 情報を修正することに重点を置いたプロトコルです。NAVERでプロファイルを修正すると、このプロトコルを通じて修正された情報をサービスに伝達します。
  4. DELETE: 情報を削除することに重点を置いたプロトコルです。会員脱退、投稿削除などDBのレコードを削除するためにサービスに要求する際に使用します。

それでは実際のデータはどうやって送受信するの?(資源の状態:State)

RESTの概念において、核心は資源を送受信する方式にあります。

実際のデータはXMLJSONフォーマットを通じてファイルを送受信するのですが、例えば先ほどのライオン写真はこのように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のプロトコルを実装できます。

  1. インターフェイスの一貫性(Uniform Interface): インターフェイスは一貫して分離されているべきという原則です。
    • 特定のフレームワークやプログラムに依存しない形式で、RESTに従って実装されたサービスの場合、HTTPプロトコルを通じて資源を送受信できるべきです。
  2. ステートレス(Stateless): 各要求間にクライアントのコンテキストがサーバーに保存されてはいけないという原則です。
    • これは以前の要求が現在の要求に絶対に影響を与えてはならないという原則を持っています。
      • 例としてログインを挙げることができます。
      • REST以前と、多くのサービスでは現在もユーザー認証情報をセッションなどの形式でサーバーに保存して管理しています。
      • ただし、完全にRESTで実装されたサービスなら、認証情報はユーザー(クライアント)が直接管理すべきです。
      • 一般的にはログイン情報をJWT Tokenのような形式で暗号化してヘッダーに保存し、認証が必要な要求ごとにヘッダーに認証情報を含めて送信する形式でログインを実装します。
  3. キャッシュ可能(Cacheable): RESTはウェブ標準HTTPプロトコルをそのまま使用するという点で大きな利点があります。
    • つまり、HTTPキャッシュ機能を使用できるのです。 キャッシュは、与えられたリソースのコピーを保存しておき、要求時にそれを提供する技術を指します。
    • もしすべての資源を要求するたびにサーバーに要求すると、サーバーには大きな負担がかかります。
    • ですから、すでに一度受け取ったファイルや、要求の場合、HTTPプロトコルはこれをキャッシュファイルとして保存しておき、すでにある資源の要求の場合は別途サーバーに要求せずにその資源を返すことをします。
  4. 階層化(Layered System): クライアントは直接サービスに要求しません。サービスはユーザーのためにAPIサーバーを準備すべきであり、クライアントはそのAPIサーバーを通じて資源を要求(Request)し、応答(Response)を受けることができます。
    • よくSpringで言われるControllerDjangoではViewがクライアントとコミュニケーションする代表的な部分です。
      • 追加的にAPI Serverはビジネスロジックのみを実行し、フロントで認証、ロードバランシングなどの追加機能を実装することができます。
  5. Code On Demand: クライアントはサーバーからスクリプトを受け取って実行しなければならないという制限事項です。ただし、必ず満たす必要はありません。
  6. クライアント - サーバー構造(Server-Client): 資源を保持する側がServer、要求する側がClientになります。
    • サーバー: API提供、ビジネスロジック処理およびストレージを担当します。
    • クライアント: サーバーに必要な資源を要求し、さらにユーザー認証やセッションなどを管理、責任を持ちます。

REST API

REST APIとは、前述のRESTアーキテクチャを基にしてクライアントが要求を送り、使用できるように実装したインターフェースを意味します。

私が以前プロジェクトをしながら実装したAPIの例をご覧ください!

image

上のようにAPIは要求URI、URIを通じて応答できる資源の状態(JSON)、要求メソッドなどを明示する必要があります。クライアント開発者はそのAPIを見てJSONXML内部のデータを適切にユーザーに表示できるようにクライアントを構成します。

RESTful

RESTfulとは、RESTアーキテクチャを実装したウェブサービスを指すために用いられる用語です。特定のウェブサービスがREST APIを実装していれば、そのサービスはRESTfulであると言えます。

目的

誰が見ても直感的に理解でき、使用しやすいAPIを作成することを目的としています。

結論

  • 今回はウェブで広く使用されているアーキテクチャであるRESTREST APIRESTfulについて調べました。
  • 説明が不十分だったり間違った点があれば、いつでもご指摘ください。即反映いたします!

参考資料