Skip to content

API設計標準

27.1. RESTful APIルール

27.1.1. URLネーミング

  • 小文字ハイフン-)のみ使用します。アンダースコア(_)とcamelCaseは使用しません。
  • リソース名は複数形を使用します。
  • URLの末尾にスラッシュ(/)を含めません。
区分正しい例誤った例
複数形/api/users/api/user
ハイフン/api/user-profiles/api/user_profiles
小文字/api/users/api/Users

27.1.2. HTTPメソッド

メソッド用途レスポンスコード
GETリソース照会GET /api/users200
POSTリソース作成POST /api/users201
PUTリソース全体修正PUT /api/users/1200
PATCHリソース部分修正PATCH /api/users/1200
DELETEリソース削除DELETE /api/users/1204

27.1.3. URL階層構造

リソース間の関係はURLパスで表現します。

GET /api/users/{userId}/orders          # 特定ユーザーの注文一覧
GET /api/users/{userId}/orders/{orderId}  # 特定ユーザーの特定注文
  • ネストは2段階までのみ許容します。
  • 3段階以上のネストが必要な場合、クエリパラメータを使用します。

27.2. リクエスト/レスポンス形式

27.2.1. 標準レスポンス構造

単一リソースレスポンス:

json
{
  "id": 1,
  "name": "田中太郎",
  "email": "user@tienipia.com",
  "createdAt": "2026-02-28T10:30:00"
}

27.2.2. 一覧レスポンス(ページネーション)

json
{
  "content": [
    {
      "id": 1,
      "name": "田中太郎",
      "email": "user@tienipia.com"
    }
  ],
  "page": 0,
  "size": 20,
  "totalElements": 150,
  "totalPages": 8
}

27.2.3. ページネーションパラメータ

パラメータ説明デフォルト値
pageページ番号(0から開始)0
sizeページサイズ20
sortソート基準未指定時はデフォルトソート
GET /api/users?page=0&size=20&sort=createdAt,desc

27.2.4. 日時形式

  • ISO 8601形式を使用します:2026-02-28T10:30:00
  • タイムゾーンが必要な場合:2026-02-28T10:30:00+09:00

27.3. エラーコード体系

27.3.1. HTTPステータスコード

コード意味使用基準
200OK照会、修正成功
201Createdリソース作成成功
204No Content削除成功
400Bad Request入力値バリデーション失敗
401Unauthorized認証が必要
403Forbidden権限不足
404Not Foundリソースなし
409Conflictリソース競合(重複等)
500Internal Server Errorサーバー内部エラー

27.3.2. カスタムエラーコード

HTTPステータスコードとは別にカスタムエラーコードを使用して、詳細なエラーを区別します。

{プレフィックス}{連番}
プレフィックスドメイン
C共通C001(不正な入力)
UユーザーU001(ユーザーなし)
A認証A001(トークン期限切れ)
O注文O001(注文なし)

27.3.3. 標準エラーレスポンス形式

json
{
  "code": "U001",
  "message": "ユーザーが見つかりません。",
  "timestamp": "2026-02-28T10:30:00"
}

入力バリデーションエラー時にはフィールドごとの詳細情報を含めます。

json
{
  "code": "C001",
  "message": "不正な入力値です。",
  "timestamp": "2026-02-28T10:30:00",
  "errors": [
    {
      "field": "email",
      "value": "invalid-email",
      "reason": "正しいメールアドレス形式ではありません。"
    }
  ]
}

27.4. APIドキュメント

27.4.1. SpringDoc適用

すべてのAPIプロジェクトはSpringDoc(OpenAPI 3.0)を適用し、Swagger UIを提供します。

xml
<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
  <version>2.8.4</version>
</dependency>
yaml
# application.yml
springdoc:
  swagger-ui:
    path: /swagger-ui.html
  api-docs:
    path: /v3/api-docs

27.4.2. APIアノテーション

ControllerとDTOにOpenAPIアノテーションを適用します。

java
@RestController
@RequestMapping("/api/users")
@Tag(name = "ユーザー", description = "ユーザー管理API")
public class UserController {

  @Operation(summary = "ユーザー照会", description = "IDでユーザーを照会します。")
  @ApiResponses({
      @ApiResponse(responseCode = "200", description = "照会成功"),
      @ApiResponse(responseCode = "404", description = "ユーザーなし")
  })
  @GetMapping("/{id}")
  public ResponseEntity<UserResponse> getUser(@PathVariable Long id) {
    return ResponseEntity.ok(userService.findById(id));
  }
}

27.4.3. ドキュメント化原則

  • すべての公開APIに @Operation アノテーションを含めます。
  • リクエスト/レスポンスDTOにフィールド説明を含めます。
  • Swagger UIは開発/ステージング環境でのみ有効化し、プロダクションでは無効化します。

TIENIPIA QUALIFIED STANDARD