発展LESSON 16
この教材で学ぶこと resource、status、validation、冪等性を含むAPI契約を設計します。HTTP API設計
対象読者: 基本文法とHTTPの概要を理解し、Web APIの設計・実装へ進みたい人。
この教材でできるようになること
- requestとresponseをmethod、path、header、bodyへ分解できる
- resourceに合うURLとHTTP methodを選べる
- status codeとerror responseを一貫して設計できる
- validation、認証、冪等性、paginationを考慮できる
1. APIを契約として捉える
POST /lessons HTTP/1.1
Content-Type: application/json
Idempotency-Key: 0f95...
{"title":"HTTP API設計","level":"advanced"}
HTTP/1.1 201 Created
Location: /lessons/lesson-123
Content-Type: application/json
{"id":"lesson-123","title":"HTTP API設計","level":"advanced"}
clientとserverは、入力、出力、失敗条件を共有する契約で結ばれます。
2. resourceとmethod
| 操作 | method | path例 |
|---|---|---|
| 一覧取得 | GET | /lessons |
| 一件取得 | GET | /lessons/{id} |
| 作成 | POST | /lessons |
| 全体置換 | PUT | /lessons/{id} |
| 部分更新 | PATCH | /lessons/{id} |
| 削除 | DELETE | /lessons/{id} |
URLには動詞を乱立させずresourceを表し、操作の意味はHTTP methodへ持たせます。ただし既存契約やdomain上のcommandが明確なら、機械的なREST化より一貫性を優先します。
3. status codeを使い分ける
200 OK: 成功しresponse bodyを返す201 Created: resourceを作成した204 No Content: 成功したがbodyなし400 Bad Request: request形式が不正401 Unauthorized: 認証が必要または失敗403 Forbidden: 認証済みだが許可されない404 Not Found: resourceが存在しない409 Conflict: 現在状態と競合422 Unprocessable Content: 形式は読めるが値が要件を満たさない500 Internal Server Error: server側の予期しない失敗
内部例外やstack traceをそのまま外部へ返しません。
4. error responseを統一する
{
"code": "INVALID_LEVEL",
"message": "level must be beginner, intermediate, or advanced",
"details": [
{ "field": "level", "reason": "unsupported value" }
],
"requestId": "req-123"
}
利用者向けmessage、機械判定用code、調査用request IDを分けます。request IDからserver logを追えるようにしつつ、秘密情報をresponseへ含めません。
5. validationと認証認可
検証の順序例:
- body sizeやcontent type
- JSONとして読めるか
- 必須fieldと型
- 値の範囲
- 認証
- 対象resourceへの権限
- domain rule
認証済みであることと、そのresourceを操作できることは別です。resource所有者やroleをserver側で検証します。
6. 冪等性とretry
network timeoutでは、serverで成功したのにclientがresponseを受け取れないことがあります。作成や決済のような重複が困る操作では、clientが一意なkeyを送り、serverが同じkeyの結果を再利用する設計を検討します。
GET、PUT、DELETEはHTTP semantics上idempotentですが、実装の副作用まで自動で安全になるわけではありません。
7. pagination
GET /lessons?limit=20&cursor=eyJpZCI6...
大きな一覧を一度に返さず、上限を設けます。並び順を固定し、cursorの改ざんや期限切れを扱います。
演習: 学習教材API
次のendpointについてrequest、成功response、validation error、権限errorを書いてください。
- 教材を作成
- 教材一覧をlevelでfilter
- 教材を完了へ変更
- 教材を削除
さらに、同じ完了requestが二回来た場合の結果と、同時更新時の競合処理を決めます。
理解チェック
- requestとresponseの構成要素を説明できる
- methodとstatus codeを意味から選べる
- error responseを一貫した形で設計できる
- retry、冪等性、paginationの必要性を判断できる
公式資料
次に読む
設計とリファクタリングで、APIの内側を変更しやすく保ちます。