ホーム > Swagger・OpenAPI実践ガイド - RESTful APIドキュメントの標準化

Swagger・OpenAPI実践ガイド - RESTful APIドキュメントの標準化

APIの仕様書をWordやGoogleドキュメントで管理していた時代を覚えているでしょうか。「最新版はどこにあるの?」「このエンドポイント、いつの間にか変わってない?」と困惑した経験がある方も多いはずです。現在では、SwaggerとOpenAPIの登場により、APIドキュメントの標準化と自動化が大きく前進しました。

実は、SwaggerとOpenAPIは混同されがちですが、厳密には異なる概念です。SwaggerはもともとAPIの記述・設計・テストを行うためのツール群の総称で、その仕様部分がOpenAPI Specificationとして独立しました。現在のSwaggerブランドはSmartBear社が管理するツール群(Swagger UI、Swagger Editor、Swagger Codegenなど)を指し、仕様そのものはOpenAPIの名称で呼ばれています。この記事では、SwaggerツールとOpenAPI仕様を組み合わせた実践的なAPIドキュメント標準化の手法を詳しく解説していきます。

SwaggerとOpenAPIの関係を正しく理解する

SwaggerとOpenAPIの違いを正確に把握しておくことは、チーム内のコミュニケーションを円滑にするうえで欠かせません。「Swagger対応してる?」という質問に対して、仕様の話をしているのかツールの話をしているのかが曖昧だと、議論がかみ合わなくなるためです。

Swaggerの歴史は2010年頃にさかのぼります。当時、Wordery社のTony Tam氏がAPI設計のためのフレームワークとしてSwaggerを開発しました。その後、2015年にSmartBear社がSwaggerを買収し、仕様部分をLinux FoundationのOpenAPI Initiative(OAI)に寄贈しました。これにより、API記述の標準仕様は「OpenAPI Specification」として業界全体で管理されることになったのです。Google、Microsoft、IBM、Amazonなどの大手テック企業がOAIのメンバーとして参画しており、事実上の業界標準となっています。

そういえば、バージョンの呼び方にも注意が必要です。Swagger時代の仕様はSwagger 2.0と呼ばれ、OpenAPIに移管された後のバージョンはOpenAPI 3.0、そして最新のOpenAPI 3.1へと進化しています。Swagger 2.0とOpenAPI 3.0の間には構造的な違いがあり、単純な名前の変更ではありません。OpenAPI 3.0ではコンポーネントの再利用性が向上し、3.1ではJSON Schemaとの完全互換が実現されるなど、着実に進化を遂げています。

現在「Swagger」と呼ばれているのは、SmartBear社が提供するオープンソースのツール群です。Swagger UIはAPI仕様を視覚的に表示する画面、Swagger Editorは仕様ファイルを対話的に編集するエディタ、Swagger Codegenは仕様からクライアントコードやサーバーのスタブを自動生成するツールです。これらのツールはOpenAPI仕様に準拠した仕様ファイルを入力として受け取り、さまざまな出力を生成します。

OpenAPI仕様ファイルの書き方

OpenAPIの仕様ファイルを初めて書く場合、その構造に少し圧倒されるかもしれません。しかし、基本的な構造を理解してしまえば、あとはパターンの繰り返しです。ここでは、仕様ファイルの骨格から実践的な記述テクニックまでを順を追って見ていきましょう。

OpenAPI 3.xの仕様ファイルは、大きく分けて「info」「servers」「paths」「components」の4つのセクションで構成されます。infoセクションにはAPIのタイトル、バージョン、説明文などのメタデータを記載します。serversセクションにはAPIのベースURLを定義し、本番環境・ステージング環境・開発環境といった複数の環境を切り替えられるようにできます。pathsセクションが仕様の中核で、各エンドポイントのHTTPメソッド、パラメータ、リクエストボディ、レスポンスを定義します。

実は、componentsセクションを上手に活用できるかどうかが、仕様ファイルの保守性を大きく左右します。リクエストやレスポンスで共通して使われるスキーマ(データ構造)をcomponentsに定義し、pathsから参照する形にすることで、同じ定義を何度も書く必要がなくなります。たとえば、ユーザー情報のスキーマを一箇所に定義しておけば、ユーザー一覧取得API、ユーザー詳細取得API、ユーザー作成APIのいずれからも同じスキーマを参照できます。変更が必要になった場合も、一箇所を修正するだけで全体に反映されるため、不整合のリスクを大幅に減らせるのです。

そういえば、仕様ファイルの記述で見落としがちなのがexample(例示データ)の充実度です。スキーマの定義だけでは、実際のリクエストやレスポンスがどんな形になるのかイメージしにくい場合があります。exampleフィールドに具体的な値を記載しておくと、Swagger UIでの表示がわかりやすくなるだけでなく、モックサーバーがそのデータを返してくれるようになります。フロントエンド開発者にとっては、実際に近いデータで動作確認ができるため、開発効率が格段に上がります。

パラメータとリクエストボディの定義

APIのパラメータには、パスパラメータ、クエリパラメータ、ヘッダーパラメータ、Cookieパラメータの4種類があります。OpenAPIではこれらを明確に区別して定義でき、それぞれに必須/任意の指定、デフォルト値、バリデーションルールなどを設定できます。特にクエリパラメータは数が多くなりがちなので、componentsに共通パラメータを定義して再利用するのが効率的です。

リクエストボディの定義では、content typeごとに異なるスキーマを設定できる点が便利です。同じエンドポイントでJSON形式とフォームデータ形式の両方を受け付ける場合、それぞれに適切なスキーマを定義できます。ファイルアップロードのエンドポイントでは、multipart/form-dataのスキーマ定義が必要になりますが、OpenAPI 3.0以降ではこの定義も直感的に記述できるようになっています。

ところで、レスポンスの定義も疎かにしてはいけません。正常系のレスポンスだけでなく、400(バリデーションエラー)、401(認証エラー)、403(権限不足)、404(リソース未検出)、500(サーバーエラー)といったエラーレスポンスも漏れなく定義しておくことが重要です。エラーレスポンスのスキーマを共通化しておくと、フロントエンド側のエラーハンドリングが統一的に行えるようになります。

Swagger UIによるインタラクティブドキュメント

OpenAPIの仕様ファイルを作成したら、Swagger UIでドキュメントを可視化してみましょう。Swagger UIは、仕様ファイルを読み込んで、ブラウザ上で操作できるインタラクティブなAPIリファレンスを生成するツールです。単なるドキュメントではなく、その場でAPIリクエストを実行できる「Try it out」機能が大きな特徴です。

Swagger UIの導入方法はいくつかあります。最も手軽なのは、CDNからJavaScriptとCSSを読み込んで静的なHTMLページに埋め込む方法です。Node.jsプロジェクトであればswagger-ui-expressパッケージを使って、Expressアプリケーションにミドルウェアとして組み込むこともできます。Dockerイメージも公式に提供されているため、コンテナ環境で手軽に立ち上げることも可能です。

実は、Swagger UIの「Try it out」機能は開発中のデバッグにも重宝します。PostmanやcURLを使ってAPIをテストすることもできますが、Swagger UIであればパラメータの入力フォームが自動的に生成されるため、手入力の手間が省けます。リクエストヘッダーの設定やOAuth認証のフローもSwagger UI上で完結できるため、認証が必要なAPIのテストもスムーズに行えます。ただし、本番環境ではSwagger UIを公開しないように注意が必要です。セキュリティの観点から、開発環境やステージング環境でのみ表示するのが一般的な運用方法です。

そういえば、Swagger UIのカスタマイズも可能です。デフォルトのテーマは緑色が基調のデザインですが、CSSを上書きすることで自社のブランドカラーに合わせた見た目に変更できます。ロゴの差し替えやレイアウトの変更もサポートされているため、社内ツールとして使う場合でも違和感のないドキュメントサイトを構築できます。

Redocという選択肢

Swagger UIに代わるドキュメント表示ツールとして、Redocも高い人気を集めています。Redocは三段組のレイアウトが特徴で、左ペインにナビゲーション、中央にAPIの詳細説明、右ペインにリクエスト・レスポンスのサンプルが表示されます。大規模なAPIドキュメントを閲覧する際には、このレイアウトの見やすさが際立ちます。

Redocは静的HTMLとしての出力にも対応しているため、ビルド時にHTMLを生成してホスティングするだけで、サーバーサイドの処理なしにドキュメントサイトを公開できます。GitHub PagesやNetlify、Vercelなどの静的ホスティングサービスと組み合わせることで、低コストでAPIドキュメントを運用できるのがメリットです。

ところで、RedocにはSwagger UIのような「Try it out」機能がデフォルトでは備わっていません。ドキュメントの閲覧に特化しているため、APIの実行テストはPostmanや別のツールで行う必要があります。ただし、Redocly社が提供する有料版のRedocly API Portalでは、対話的なAPI実行機能やチーム管理機能が追加されています。

モックサーバーの構築と活用

API仕様が先にできていれば、バックエンドの実装を待たずにモックサーバーを立ち上げて開発を進められます。この並行開発のアプローチは、開発期間の短縮に大きく貢献します。

Prism(Stoplight社製)は、OpenAPIの仕様ファイルからモックサーバーを即座に起動できるツールです。仕様ファイルに定義されたexampleデータに基づいてレスポンスを返してくれるため、フロントエンド開発者は実際のAPIに近い環境で開発を進められます。バリデーション機能も備わっており、仕様に準拠しないリクエストを送った場合にはエラーを返してくれるため、フロントエンド側の実装ミスを早期に発見できます。

実は、モックサーバーの活用場面は開発だけにとどまりません。E2Eテストの実行環境としても活用できます。テスト実行時に外部APIへのリクエストをモックサーバーに向けることで、テストの安定性と実行速度が向上します。外部サービスの障害やレート制限に影響されずにテストを回せるため、CI/CDパイプラインの信頼性が高まるのです。

そういえば、WireMockやMSW(Mock Service Worker)のようなモックツールも、OpenAPIの仕様ファイルと連携できます。MSWはブラウザとNode.jsの両方で動作するため、フロントエンドの開発環境とテスト環境の両方でモックを共有できるのが強みです。OpenAPIの仕様からMSWのハンドラーを自動生成するライブラリも存在するため、仕様変更への追従も効率的に行えます。

コード生成で開発効率を最大化する

OpenAPIの仕様ファイルから得られる恩恵は、ドキュメントの生成だけではありません。クライアントコードやサーバーのスタブコードを自動生成することで、APIの型安全性を担保しつつ開発効率を大幅に向上させられます。

OpenAPI Generatorは、OpenAPIの仕様ファイルから40以上のプログラミング言語やフレームワーク向けのコードを生成できるツールです。TypeScriptのHTTPクライアント、JavaのSpring Bootサーバー、PythonのFlaskサーバーなど、多彩なテンプレートが用意されています。フロントエンド開発でよく使われるのは、TypeScriptのAxiosクライアントやFetchクライアントの生成です。APIの型定義が自動的にTypeScriptの型として出力されるため、エンドポイントの呼び出し時に型チェックが効きます。

実は、生成されたコードをそのまま使うか、カスタマイズするかはプロジェクトの方針によります。小規模なプロジェクトではそのまま使うのが手軽ですが、大規模なプロジェクトではテンプレートをカスタマイズして、チームの規約に合ったコードを生成するのが一般的です。OpenAPI Generatorではテンプレートエンジン(Mustache)を使ってコード生成のテンプレートをカスタマイズできるため、自由度の高いコード生成が可能です。

そういえば、コード生成をCI/CDパイプラインに組み込む方法も検討に値します。API仕様が更新されるたびにクライアントコードを自動再生成し、フロントエンドのリポジトリにプルリクエストを作成する、というワークフローを構築できます。こうすることで、APIの変更がフロントエンドに自動的に伝播し、型の不整合による実行時エラーを防げます。orvalやopenapi-typescriptのようなTypeScript特化のツールは、より軽量でTypeScriptとの親和性が高いため、フロントエンドプロジェクトではこちらを選ぶケースも増えています。

チーム開発での運用ガイドライン

SwaggerとOpenAPIをチーム全体で効果的に活用するには、明確な運用ガイドラインが不可欠です。ツールの導入だけでは十分ではなく、チームメンバー全員が同じルールに従って仕様を管理する文化を醸成することが重要です。

まず決めるべきは、仕様ファイルの管理方法です。APIのソースコードと同じリポジトリに仕様ファイルを配置するか、独立したリポジトリで管理するかという選択があります。小規模なプロジェクトではソースコードと同居させるのが手軽ですが、フロントエンドとバックエンドが別リポジトリの場合は、仕様ファイルを独立したリポジトリに置くほうが管理しやすいこともあります。どちらの場合も、仕様ファイルの変更はプルリクエストを通じてレビューする、というルールを設けておくことが大切です。

実は、命名規則の統一も運用ガイドラインの重要な要素です。エンドポイントのパスは/users/{userId}/ordersのようにケバブケースとパスパラメータの組み合わせが一般的ですが、プロジェクトによっては異なる慣習がある場合もあります。リクエスト・レスポンスのフィールド名もcamelCaseかsnake_caseかを統一しておかないと、APIの利用者が混乱します。こうした命名規則をスタイルガイドとして文書化し、Spectralのカスタムルールで自動チェックするのが理想的な運用です。

そういえば、APIの変更管理も見落とされがちなポイントです。既存のフィールドの型を変更したり、必須パラメータを追加したりする破壊的変更は、利用者に大きな影響を与えます。破壊的変更を行う際にはAPIバージョンを上げる、あるいは移行期間を設けて段階的に切り替えるといったルールを事前に定めておくべきです。swagger-diffやoasdiffのようなツールを使えば、プルリクエストの段階で破壊的変更を自動検出できるため、意図しない変更が本番に反映されるリスクを軽減できます。

まとめ

SwaggerとOpenAPIは、RESTful APIのドキュメント標準化を実現するための強力なエコシステムです。仕様ファイルを中心に据えることで、ドキュメント生成、モックサーバー構築、コード生成、バリデーションといった多彩な自動化が可能になります。

OpenAPIの仕様ファイルを丁寧に書くことが、すべての起点です。componentsによるスキーマの再利用、充実したexampleデータの記載、エラーレスポンスの網羅的な定義を心がけることで、仕様ファイルの価値は大きく向上します。Swagger UIやRedocで可視化し、Prismでモックサーバーを立ち上げ、OpenAPI Generatorでクライアントコードを自動生成するという一連のワークフローを構築すれば、API開発の効率と品質が飛躍的に高まるでしょう。

チーム開発では、仕様ファイルの管理方法、命名規則、変更管理のルールを明確にし、CI/CDパイプラインに組み込んだ自動チェックで品質を担保する体制を整えることが成功の鍵です。SwaggerとOpenAPIを使いこなすスキルは、エンジニアとしての市場価値を高める大きな武器になります。

IT転職で年収アップを実現しませんか?

エンジニア・プログラマー向け転職エージェントで、理想のキャリアを手に入れましょう。

おすすめ転職サイトを見る