OpenAPI入門:YAML仕様の書き方からSwagger UIで確認するまで
はじめに
APIを開発するとき、仕様をどうやって共有していますか?MarkdownでAPIドキュメントを書いてもすぐ古くなる、口頭で説明してすれ違いが起きる、といったことがよくあります。
OpenAPIはRESTful APIの仕様を標準フォーマットで記述することで、ドキュメントの自動生成やコードの自動生成ができる仕組みです。この記事ではOpenAPIの基本的な書き方から、Swagger UIで視覚的に確認するところまでを解説します。
OpenAPIとは
OpenAPI(旧称:Swagger)は、RESTful APIの仕様をYAMLまたはJSON形式で記述するための標準フォーマットです。エンドポイント・リクエスト・レスポンスをコードと同じリポジトリで管理できます。
現在のバージョンはOpenAPI 3.1です。
使うメリット - Swagger UIなどでAPIドキュメントを自動生成できる - フロントエンドとバックエンドで仕様を事前に合意できる - クライアントコードやサーバースタブを自動生成できる - 仕様とコードを同じリポジトリで管理できる
基本構造
OpenAPI仕様はいくつかのセクションで構成されています。
openapi: 3.1.0 # OpenAPIのバージョン info: # APIの基本情報 title: My API version: 1.0.0 paths: # エンドポイントの定義 /users: get: ... components: # 共通で使うスキーマの定義 schemas: ...
シンプルなAPI仕様を書いてみる
ユーザー一覧を返すAPIを例に書いてみます。
openapi: 3.1.0 info: title: User API version: 1.0.0 paths: /users: get: summary: ユーザー一覧を取得する responses: '200': description: 成功 content: application/json: schema: type: array items: $ref: '#/components/schemas/User' /users/{id}: get: summary: ユーザーを1件取得する parameters: - name: id in: path required: true schema: type: integer responses: '200': description: 成功 content: application/json: schema: $ref: '#/components/schemas/User' '404': description: 見つからない components: schemas: User: type: object properties: id: type: integer example: 1 name: type: string example: 田中太郎 email: type: string example: tanaka@example.com
ポイント解説
paths: エンドポイントのパスをキーにして定義するparameters: パスパラメータやクエリパラメータを定義する(in: path/in: query)responses: ステータスコードごとにレスポンスを定義する$ref: 共通のスキーマを参照する(同じ定義の重複を避ける)components/schemas: 使い回すスキーマをここにまとめる
リクエストボディを定義する
POSTやPUTなど、リクエストボディが必要な場合は requestBody で定義します。
/users: post: summary: ユーザーを作成する requestBody: required: true content: application/json: schema: type: object required: - name - email properties: name: type: string example: 田中太郎 email: type: string example: tanaka@example.com responses: '201': description: 作成成功 content: application/json: schema: $ref: '#/components/schemas/User'
required に必須プロパティを列挙することで、バリデーションツールが未入力を検知できます。
Swagger UIで確認する
書いたOpenAPI仕様をSwagger UIで視覚的に確認できます。エンドポイントの一覧表示や、ブラウザ上からの試し打ちができます。
オンラインで確認する(インストール不要)
Swagger Editor にアクセスして、左側のエディタに書いたYAMLを貼り付けるだけです。右側にSwagger UIがリアルタイムで表示されます。
Dockerでローカル実行する
docker run -p 8080:8080 swaggerapi/swagger-ui
http://localhost:8080 にアクセスするとSwagger UIが起動します。
ローカルのYAMLファイルを読み込む場合は以下のように指定します。カレントディレクトリに openapi.yaml がある場合に使えます。
docker run -p 8080:8080 \ -e SWAGGER_JSON=/spec/openapi.yaml \ -v $(pwd):/spec \ swaggerapi/swagger-ui
まとめ
- OpenAPIはRESTful API仕様をYAML/JSONで記述する標準フォーマット(旧称:Swagger)
pathsでエンドポイント、components/schemasで共通スキーマを定義する$refで同じスキーマを使い回して重複を避けられる- Swagger Editor(オンライン)やSwagger UI(Docker)で視覚的に確認できる
nullable・enum・共通化など詳細なスキーマ設定は「OpenAPIスキーマ設定チートシート:nullable・enum・共通化まで」を参照してください。
RailsでOpenAPIを活用したコントローラー実装については「RailsでOpenAPIを使ったコントローラー作成入門」を参照してください。