REST API設計
REST APIを設計するにあたってパスやHTTPメソッドなど、考えるべき事柄に対する指針を例示します。
パス
RESTの定義に沿って、リソースを表すものとして使用します。
どのようなリソースであるかを分かりやすくするため、基本的に名詞を使用します。
/api/channels
/api/messages
リソースが集合である場合、その中に含まれる個々のリソースを表す場合には、集合のリソースを表すパスに続けて識別する値を含めたパスとします。
/api/messages/:id
リソースが別のリソースの子リソースであることを表す場合には、親リソースを含めたパスとします。なお、実際の管理上は親子関係となるリソースであってもパスで子リソースであることを表す必要がなければ、親リソースは含めないパスとしてもよいでしょう。
例えばメッセージリソースにはチャンネルリソースの子としての関係がある場合、次に示すAのようにチャンネルリソースをパスの上位に含めてもBのようにチャンネルリソースを含めなくても、どちらでもよいでしょう。
- A.
/api/channles/:name/messages/:id - B.
/api/messages/:id
リソースで表すのが困難な場合、次のように動詞を使用して操作を表すパスとすることもあります。ただし、基本的にはリソースで表すものとするため、安易には使用しないでください。
/api/signup
HTTPメソッド
RESTの定義に沿って、リソースに対する操作を表すものとして使用します。主な操作としては次のものを使用します。
| メソッド名 | 説明 |
|---|---|
| GET | リソースの取得 |
| POST | リソースの新規登録 |
| PUT | 既存リソースの更新 |
| DELETE | リソースの削除 |
| PATCH | リソースの一部変更 |
パスがリソースではなく操作を表す場合、「操作する」ためのメソッドとしてPOSTを使用します。
Note
CORSを使用する場合はプリフライトリクエストでOPTIONSを使用しますが、ブラウザが自動的に発行するリクエストであるため、主な操作には含めていません。
CORSについてはCORS(オリジン間リソース共有)を参照してください。
HTTPステータスコード
HTTPの仕様に沿って、HTTPステータスコードを使用します。
主に次のものを使用します。
| ステータスコード | 意味 |
|---|---|
| 200 - 299 | 成功 |
| 400 - 499 | クライアントサイドに起因するエラー |
| 500 - 599 | サーバーサイドに起因するエラー |
なお、リクエストが成功した場合のステータスコードとしてはレスポンスボディがあれば200(OK)、なければ204(No Content)を使用します。
POST等により新しいリソースが作成された場合には201(Created)およびLocationヘッダの使用が考えられますが、フレームワークによっては201を返すのが煩雑なコードになる場合があります。フロントエンドでハンドリングするための情報として200で必要十分であれば201は使用しなくても良いでしょう。
参考資料
データフォーマット
リクエストおよびレスポンスのデータフォーマットはJSONとします。ただし、ファイルアップロード用のデータ送信時にはマルチパートを使用します(ファイルアップロードを参照)。 また、ファイルダウンロード用のデータ送信時には任意のフォーマットを使用します(ファイルダウンロードを参照)。
日時については文字列で扱うこととし、ISO 8601(拡張形式)に準じたフォーマットとします。
参考資料
エラー情報
ステータスコードでエラーの種類を判別できない場合はレスポンスボディにエラー情報を含めることを検討してください。
成功時と同じように処理するため、エラー時のレスポンスボディもJSON形式とし、エラーコードやエラーメッセージを含めると良いでしょう。 例を示します。
{
"code": 123,
"message": "xxxの値が不正です"
}
バージョニング
REST APIを変更する際は、なるべく後方互換性を保つのが望ましいです。 変更におけるいくつかのユースケースと後方互換の有無を例示します。
| ユースケースの例 | 後方互換の有無 |
|---|---|
| 新しいAPIを追加する | 新規追加なので既存APIに影響はなく、後方互換あり |
| 既存のAPIに渡す値へ新しい項目を追加する | デフォルト値を用意すれば後方互換性を保てる |
| 既存のAPIから返される値に項目を追加する | 既存の項目がなくなるわけではないので後方互換あり |
| 既存のAPIの振る舞いが変わる | 後方互換なし |
| 既存のAPIを廃止する | 後方互換なし |
後方互換性を崩す変更を伴う場合、一例としてパスによるバージョニングがあります。 パスのルートにバージョン番号を含めて、各API毎ではなくAPI全体をバージョニングします。
- 既存のAPIのルートパス -
/api/v1
後方互換性を崩さない変更であれば、このルートパスを使い続ける - 後方互換性を崩す新しいAPIのルートパス -
/api/v2
次に後方互換性を崩す変更が入るまでは、このルートパスを使う
なお、REST APIの公開範囲が自分たちの管理下にあればクライアントアプリケーションの変更も管理できるため、REST API単体でのバージョニングは行わなくても良いでしょう。
参考資料
Representational State Transfer - Wikipedia
※ このドキュメントはFintan コンテンツ 使用許諾条項の下に提供されています。
※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。