2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenAPIでenumを使った固定値の扱い方

Posted at

はじめに

API仕様書を書くときに「特定の決まった値しか受け付けない」ケースを記載する必要があることがあります。例えばユーザーの状態が「active / inactive」だけ、あるいはロールが「admin / user / guest」に限定されているような場面です。
本記事では、それをOpenAPIでどのように表現できるのか、そしてOpenAPI 3.0から可能になった共通化の方法を公式ドキュメントをもとにご紹介します。

OpenAPIで固定値を受け付ける方法

OpenAPIではenumを使うことで前述したような固定値の制約を表現することができます。

parameters:
  - in: query
    name: status
    schema:
      type: string
      enum: [active, inactive]

enumは上記のように配列のような形で指定します。1つ以上指定されている必要があるだけで、単一の値のみを指定することもできます。

parameters:
  - in: query
    name: status
    schema:
      type: string
      enum: [fixed-value]

enumは配列のような形ではなく、以下のように書くこともできます。チームのルールや可読性に合わせて使い分けます。

parameters:
  - in: query
    name: status
    schema:
      type: string
      enum:
        - active
        - inactive

さらに、説明を加える必要がある場合には description に記載します。

parameters:
  - in: query
    name: status
    schema:
      type: string
      enum:
        - active
        - inactive
    description: "ユーザの状態は active または inactive を指定してください"

OpenAPI 3.0では共通化ができる

OpenAPI 2.0では、enumを再利用することができませんでした。同じenumの中身でも繰り返し記述する必要があり、保守性に問題がありました。
しかし、OpenAPI 3.0では共通化してenumを再利用することができます。

components:
  schemas:
    UserStatus:
      type: string
      enum: [active, inactive]

paths:
  /users:
    get:
      parameters:
        - in: query
          name: status
          schema:
            $ref: '#/components/schemas/UserStatus'

nullの扱い

OpenAPI 3.0ではenumにnullを明示的に表記できます。

components:
  schemas:
    UserStatus:
      type: string
      nullable: true
      enum: [active, inactive, null]

この場合、nullable: true を指定する必要があり、また、enumに null を明記する必要があります。

OpenAPI 3.1以降では nullable は廃止され、次のように type に配列で null を含めて表現します。

type: [string, "null"]
enum: [active, inactive, null]

仕様書の全体例

openapi: 3.0.4
info:
  title: Sample API
  version: "1.0.0"

paths:
  /register:
    post:
      summary: Register a user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required: [role]
              properties:
                role:
                  $ref: '#/components/schemas/UserRole'
      responses:
        "201":
          description: User registered
        "400":
          description: Invalid role

components:
  schemas:
    UserRole:
      type: string
      enum: [admin, user, guest]

OpenAPIでenumを使用した場合の仕様書の見た目

このようにリクエストボディに組み込むと、クライアント側で「admin / user / guest 以外は送れない」ことが明示的になります。

まとめ

本記事では、OpenAPIにおけるenumの使い方と、OpenAPI 3.0から可能になった共通化について紹介しました。

enumを使うことで、APIが受け付ける値を特定の固定値に制約できます。これは仕様の明確化や入力チェックだけでなく、OpenAPI Generatorなどのクライアント生成ツールを使った場合にも型安全性を高めてくれます。

さらに、OpenAPI 3.0ではcomponents/schemasを利用してenumを共通定義として切り出せるようになり、複数のエンドポイントで同じ定義を再利用できるようになりました。これにより、保守性が大きく向上し、DRYな設計を実現できます。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?