Web - REST
概要
REST (Representational State Transfer) は、Webシステムの設計思想の1つである。
2000年にRoy Fieldingが提唱した概念であり、現代のWeb APIの設計において最も広く採用されているアーキテクチャスタイルである。
RESTの基本的な考え方として、Webシステムをリソースとそのリソースへのアクションとして捉えることである。
例えば、ユーザ情報というリソースに対して、取得・作成・更新・削除といったアクションを実行するという考え方である。
RESTの特徴として、ステートレス性がある。
これは、サーバがクライアントの状態を保持せず、各リクエストが独立していることを意味する。
そのため、スケーラビリティが高く、システムの拡張が容易になる。
RESTful APIにおける基本的なHTTPメソッドの使用例を以下に示す。
- GET
- リソースの取得
- 例: ユーザ情報の閲覧
- POST
- リソースの作成
- 例: 新規ユーザの登録
- PUT / PATCH
- リソースの更新
- 例: ユーザ情報の変更
- DELETE
- リソースの削除
- 例: ユーザアカウントの削除
また、URLの設計も重要な要素であり、RESTfulなURLはリソースを明確に示して階層構造を持つべきとされている。
例えば、"/users/123/orders"というURLは、"ID 123"のユーザの注文一覧を表現している。
レスポンスについては、一般的にJSON形式が用いられており、適切なHTTPステータスコードと共に返される。
成功時は200番台、クライアントエラーは400番台、サーバエラーは500番台のステータスコードが使用される。
セキュリティでは、RESTful APIはHTTPS通信を用いて、認証・認可にはJWTやOAuth等の仕組みを組み込むことが一般的である。
これにより、安全なデータのやり取りが可能となる。
RESTの原則を完全に満たすシステムの構築は実際には難しい場合もあるが、可能な限り準拠することにより、拡張性が高く保守性の良いWebシステムを設計することができる。
なお、近年ではGraphQL等、RESTに代わる新しいアプローチも登場しているが、RESTの考え方はWeb APIの基本となっている。
RESTの制約事項
RESTでは、主要な6つの制約事項が存在する。
- クライアント・サーバ分離
- ユーザインターフェースの関心事とデータストレージの関心事を分離することにより、移植性とスケーラビリティを向上させる。
- ステートレス性
- 各リクエストは完全に独立しており、以前のリクエストとは無関係に処理される。
- セッション状態はクライアント側で管理する必要がある。
- キャッシュ制御
- レスポンスには、そのデータがキャッシュ可能かどうかを明示する必要がある。
- 効率的なキャッシュは、クライアント・サーバ間の相互作用を部分的に排除して、スケーラビリティを向上させる。
- 統一インターフェース
- URI、HTTPメソッド、メディアタイプ等のインターフェースを統一することにより、全体的なシステムアーキテクチャがシンプルになり、各部分の独立性が向上する。
- 階層化システム
- クライアントは、直接サーバに接続されているのか、中間サーバに接続されているのかを判別することができない。
- この特性により、ロードバランシングやセキュリティポリシーの実装が容易になる。
- コードオンデマンド (オプション)
- クライアントの機能をダウンロード可能なアプレットやスクリプトの形で拡張できる。
RESTにおける実装上の考慮事項
以下に示す要素を実装することにより、堅牢で保守性の高いRESTful APIを構築することができる。
また、これらの原則は、システムの拡張性と再利用性を向上させる基盤となる。
リソースの命名規則
- 名詞を使用し、動詞は避ける。
- 複数形を使用する。
- 一貫性のある命名パターンを維持する。
APIバージョニング手法
- URLパスにバージョンを含める。
- 例 : /api/v1/users
- カスタムヘッダを使用
- 例 : Accept-Version: v1
- メディアタイプバージョニング
- 例 : Accept: application/vnd.company.api-v1+json
エラーハンドリング
- 適切なHTTPステータスコードを使用する。
- 明確なエラーメッセージの提供
- エラーの詳細情報の構造化
セキュリティ考慮事項
- トークンベースの認証
- レート制限の実装
- 入力バリデーション
- CORS (Cross-Origin Resource Sharing) の設定