OpenAPIの記法についてのまとめ

こんにちは。
PHR事業開発部の村越です。

今回は、業務で使用しているOpenAPIの記法についてまとめようかと思います。

OpenAPIとは?

OpenAPIとは、RESTful APIを記述する際のフォーマットになります。
OpenAPIはYAMLファイルで記載され、そこからドキュメントやAPI Clientの自動生成が可能です。

記法

OpenAPIの基本構造は下記になります。

openapi: 3.0.0
info:
  # APIに関する情報を記載する
servers:
  # APIのURLを記載する
paths:
  # APIのエンドポイントを記載する
components:
  # APIで使用するオブジェクトスキーマを記載する
tags:
  # APIで使用されるタグのリストを記載する

それぞれについて詳細に記載します。

info

info:
  # タイトル:必須
  title: TEST API

  # 説明
  description: テスト用APIです。

  # 利用規約
  termsOfService: http://example.com/terms/

  # コンタクト用の情報(サポートのURL、メールアドレス)
  contact:
    name: APIサポート
    url: http://www.example.com/support
    email: support@example.com

  # ライセンス情報
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html

  # APIドキュメントのバージョン:必須
  version: 1.0.0

servers

servers:
  # 本番、ステージングなど、複数の記載が可能
    # サーバーのURL:必須
  - url: https://api.test-server.com/v1
    # サーバーの説明
    description: 本番サーバー
  - url: https://stg.test-server.com/v1
    description: ステージングサーバー

paths

基本的な構造は以下のようになります。

paths:
  # APIのエンドポイント。複数記載可能
  /users:
    # HTTPメソッド(GET, PUT, POST, DELETE, OPTIONS, DELETE, PATCH, TRACEが使用可能)
    get: # GET
      # 最初に記載したtagsのどれに当たるかを記載する
      tags:
        - user
      # APIの概要
      summary: ユーザー取得
      # APIの説明
      description: 全ユーザーを取得して返却する
      # レスポンスの定義
      responses:
        # HTTP ステータス
        '200':
          # 説明
          description: successful operation
          # レスポンスを記載
          content:
            # レスポンスの形式を指定
            application/json:
              schema: 
                type: array
                items:
                  $ref: '#/components/schemas/User' # 参照するモデル
                example: # サンプルデータ
                  - id: 1
                    name: のぼり始
                  - id: 2
                    name: のぼり益代
    post: # POST
      tags: 
        - users
      summary: ユーザー作成
      description: ユーザーを新規に作成する
      # リクエストボディ
      requestBody:
        description: 作成するユーザーの情報
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
            example:
              id: 3
              name: のぼり新
      responses:
        '200':
          description: successful operation

上記の/usersのように、APIの定義を複数記載します。
途中に出てくる $ref は Components Object というもので、components配下で定義したオブジェクトスキーマを呼び出しています。
こちらの記載は後ほど紹介します。

URLにパラメータが付与されている場合の記載は以下になります。

paths:
  /users/{userId}:
    get:
      tags:
        - users
      summary: ユーザー検索.
      description: 指定したユーザーの情報を返却する
      # リクエストパラメータ
      parameters:
        - name: userId # パスで指定した値を記載
          in: path # パラメータをパス内に含める
          description: ユーザーID
          required: true
          schema:
            type: integer
      responses:
        '200':
          description: successful operation
          content:
            application/json:
              schema: 
                type: object
                items:
                  $ref: '#/components/schemas/User'
                example:
                  id: 1
                  name: のぼり始

上記のように、パス内に{XXXX}の形式でパラメータを記載し、parameters内で形式などを指定します。
パス内に含める場合は、in に path を指定しますが、headerやqueryを指定することで、それぞれヘッダー、クエリに指定したパラメータを付与することが出来ます。

parameters:
  - name: token
    in: header
    description: トークン
    required: true
    schema:
      type: string
  - name: query
    in: query
    description: 検索したい文字列
    required: true
    schema:
      type: string

components

components:
  # スキーマオブジェクトの定義
  schemas:
    # モデル名
    User:
      # 型
      type: object
      # 必須プロパティ
      required:
        - id
      # プロパティ
      properties:
        # プロパティ名
        id:
          # 型
          type: integer
          # フォーマット
          format: int64
        name:
          type: string

上記は、pathsで記載した User の定義になります。
Userのようなモデルは、components→schemasの下に定義を記載します。
componentsにはschemasの他に
requestBodies、responses、parameters
などを記載することが出来ます。

paths:
  /users:
    post:
      tags: 
        - users
      summary: ユーザー作成
      description: ユーザーを新規に作成する
      requestBody:
        $ref: '#/components/requestBodies/ReqUser'
      responses:
        '200':
          description: successful operation
  /users/{userId}:
    get:
      tags:
        - users
      summary: ユーザー検索.
      description: 指定したユーザーの情報を返却する
      parameters:
        - $ref: '#/components/parameters/UserId'
      responses:
        '200':
          $ref: '#/components/responses/success'

components:
  parameters:
    UserId:
      in: path
      description: ユーザーID
      required: true
      schema:
        type: integer
  requestBodies:
    ReqUser:
      description: 作成するユーザーの情報
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/User'
            example:
              id: 3
              name: のぼり新
  responses:
    success:
      description: successful operation
      content:
        application/json:
          schema: 
            type: object
            items:
              $ref: '#/components/schemas/User'
            example:
              id: 1
              name: のぼり始
  schemas:
    User:
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string

tags

tags:
    # タグ名:必須
  - name: users
    # タグの説明
    description: ユーザーに関する操作

最後に

今回はOpenAPIの記法についてまとめてみました。
OpenAPIは今まで使ったことがなく、慣れるまでは時間がかかり面倒だなと思うこともあったのですが、慣れてしまえばドキュメントが簡単に記載でき、API Clientの自動作成もしてくれるのでとても楽になると思います。

今回は以上となります。
今後とも「PSP」をよろしくお願い致します。

村越