🍣

REST APIって何者?

に公開

概要

なんか聞いたことあるやつ。
本稿ではREST APIとは何なのか、加えてその原則の概要について説明します。

REST APIとは

REST API(RESTful API)とは、「RESTfulな設計思想に基づいて作られたAPI」です。
特別な技術ではないです。npm installとかで拾ってくるツールとかなのかなぁなんて思ってました。

「このAPIはRESTの原則に従っているか?」を念頭に置きながら設計・実装したAPIは、立派なREST APIとなります。

RESTの設計原則

RESTの主な設計原則は以下の4つです:

  • アドレス可能性
  • 統一インターフェース
  • ステートレス性
  • 接続性

アドレス可能性と接続性の二つは開発において特別に意識するようなものではないように思いました。

アドレス可能性

アクセスするリソースに対して一意のURIが定義されている状態です。
例えば、ユーザー情報にアクセスするためのURIが /users/123 のように一意に定義されていることを意味します。

接続性

単純にシステム間で通信可能である状態を指します。基本的なネットワークの前提条件と言えるでしょう。

統一インターフェース

統一インターフェースとは、リソースを操作する命令体系が予め定義され、共有されていることです。

具体的には:

  • HTTPメソッド(GET, POST, PUT, DELETE)の適切な使用
  • レスポンスのフォーマット(JSONなど)の統一
  • HTTPステータスコードの適切な使用

これらをプロジェクト内で統一することが重要です。

GET /articles      # 記事一覧の取得
POST /articles     # 新しい記事の作成
GET /articles/123  # 特定の記事の取得
PUT /articles/123  # 記事の更新
DELETE /articles/123  # 記事の削除

ステートレス性

サーバーがクライアントの状態を保持しないという原則です。

ステートレスの特徴:

  • 自己完結したリクエスト:各リクエストは処理に必要な情報をすべて含む
  • リクエストの独立性:各リクエストは他のリクエストから完全に独立している

ステートレスのメリット:

  • スケーラビリティの向上
    • どのサーバーでもリクエストを処理できるため、負荷分散が容易
    • 新しいサーバーノードの追加が簡単で、システムの拡張性が高い
  • 高い可用性
    • 一部のサーバーに障害が発生しても、他のサーバーが処理を継続できる
    • サーバー間で状態同期が不要なため、システムの堅牢性が向上

ユーザー認証の例

ステートレスではない場合(セッションベース)

1. クライアント: ログイン(ユーザー名/パスワード送信)
2. サーバー: セッションを作成し、セッションIDをクッキーで返す
3. クライアント: 商品ページにアクセス(セッションIDを送信)
4. サーバー: セッションIDからユーザー情報を取得し、適切なページを返す

ステートレスな場合(トークンベース)

1. クライアント: ログイン(ユーザー名/パスワード送信)
2. サーバー: JWTトークンを生成して返す(トークン情報はサーバー保持しない)
3. クライアント: トークンを保存
4. クライアント: 商品ページにアクセス(ヘッダーにトークンを含める)
5. サーバー: トークンを検証し、適切なページを返す

まとめ

触りの部分だけ勉強してみましたが、掘り下げるのはまだ難しかったです。
また出会った時に深く学んでみようと思います。
REST APIは、直感的で使いやすく、スケーラブルなAPIを設計することができることがわかりました。

Discussion