OpenAPIでREST APIを型安全にする調査
✅ 目的
自社で技術選定できる場合、GraphQL や tRPC など API 通信が型安全になるような技術選定をしています。
受託案件の現場によっては上記のように、API 通信の型安全性が確保されてないケースによく遭遇します。
この記事では、OpenAPI を用いた型安全性の確保について調査しまとめます。
✅ 対象読者
- REST API で開発しているが、API 通信が型安全じゃなくて悩んでいる人
- いつの間にか API 仕様が変更され、フロントエンドが追従できずにデグレするのがもうウンザリな人
- Swagger は使っているけど、コードの自動生成まではできてない人
- OpenAPI・Swagger とかちょっと聞いたことあるけどよく知らない人
- OpenAPI・Swagger なにそれ美味しいの?な人
✅ OpenAPI
HTTP API のための標準化された仕様言語です。
JSON または YAML 形式で記述されます。
定義した API 仕様からコードを生成したり、テストケースを記述できます。
ペットの一覧を取得する API の例
{
"/pets": {
"get": {
"description": "Returns all pets from the system that the user has access to",
"responses": {
"200": {
"description": "A list of pets.",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/pet"
}
}
}
}
}
}
}
}
}
公式ドキュメント
✅ Swagger
API の設計とドキュメント化を支援するツールです。
公式ドキュメント
以下の3種類のツールを提供しています。
- Swagger UI
- Swagger Editor
- Swagger Codegen
1つずつ解説します。
◼️ Swagger UI
API リソースを視覚化し、操作できます。
OpenAPI 仕様を元に自動生成されます。
開発メンバー間で API の設計や機能実装の際に意思疎通できます。
各 API 操作では、API に関する説明とリクエストとレスポンスの形式(正常系・異常系)などが定義できます。
◼️ Swagger Editor
API の設計と記述、ドキュメント化を支援するツールです。
左側ペインがエディタとなっていて、編集内容が即座に右側ペインの UI に反映されます。
サンプルのエディタ
◼️ Swagger Codegen
Swagger Editor で作成した API 仕様を元に、API サーバーのスタブやクライアントコードを自動生成します。
自動生成により、API 通信が型安全になります。
(動的型付け言語でどこまで型安全にできるかは未調査)
多くのフレームワーク・プログラミング言語に対応しています。
自動生成するには swagger-codegen のダウンロードが必要です。
swagger-codegen の GitHub
(この記事では詳細な使い方の説明は省きます)
✅ openapi-generator
Swagger Codegen と同じ立ち位置です。
cli ツールをインストールして、OpenAPI 仕様からコード生成します。
公式ドキュメント
対応言語は以下の URL で確認できます。
✅ Spotlight Studio
Swagger の上位互換です。
Swagger では API 仕様を JSON または YAML 形式で記述する必要があります。
Spotlight Studio では、リッチな GUI で API を設計できます。
内部的に API 仕様(JSON/YAML ファイル)を自動生成します。
GitHub と連携し、定義した API 仕様を push することができます。
公式ドキュメント
✅ まとめ
- API 仕様は OpenAPI という標準化された仕様言語で定義できる
- Swagger や Spotlight Studio などの支援ツールで API を設計・ドキュメント化できる
- 作成した OpenAPI 仕様からバックエンド・フロントエンドのコードを自動生成できる
- コードの自動生成により API 通信が型安全になる
✅ 感想
個人的には、Spotlight Studio で API 設計して、OpenAPI 仕様からコード生成する流れが開発者体験良さそうかなと感じました。
具体的な使い方は別途調査して、記事が書けたらこの記事にもリンクします。
Discussion