Swagger Codegen(コード生成)
Swagger は、OpenAPI 仕様(以前は Swagger 仕様と呼ばれていました)を中心に構築されたオープンソースツール群であり、RESTful Web サービスの設計、構築、文書化、および利用に使用されます。
Swagger の主な構成要素は次のとおりです:
- Swagger Editor: ブラウザベースのエディタで、OpenAPI 仕様を記述できます。
- Swagger UI: ビジュアルな API ドキュメントインターフェースで、開発者が対話的に API を探索できます。
- Swagger Codegen: OpenAPI 仕様に基づいてクライアントコードとサーバースタブを自動生成します。
OpenAPI 仕様は、RESTful API を記述するための言語に依存しない定義形式です。
OpenAPI を使用すると、ソースコードや追加のドキュメントにアクセスすることなく、人間とコンピュータがサービスの機能を発見および理解できます。
Swagger Codegen(コード生成)
環境準備
開始する前に、システムに以下がインストールされていることを確認してください:
- Java 8+
- Maven(Javaプロジェクト用)
- Git(ソースコードの取得用)
Swagger Codegen のインストール:
# 方法1: 使用homebrew (macOS) brew install swagger-codegen # 方法2: 从GitHub下载JAR文件 wget https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.36/swagger-codegen-cli-3.0.36.jar -O swagger-codegen-cli.jar java -jar swagger-codegen-cli.jar help
クライアントSDKの生成
Java クライアントの生成
Petstore API を例に Java クライアントを生成する:
# 使用命令行工具 swagger-codegen generate -i https://petstore.swagger.io/v2/swagger.json -l java -o ./java-client # 或使用JAR文件 java -jar swagger-codegen-cli.jar generate \ -i https://petstore.swagger.io/v2/swagger.json \ -l java \ -o ./java-client
生成されたクライアントSDKの構造:
java-client/ ├── pom.xml # Maven项目文件 ├── README.md # 说明文档 ├── src/ │ ├── main/ │ │ ├── java/ # 生成的Java代码 │ │ └── resources/ # 配置文件 │ └── test/ # 测试代码 └── .gitignore
生成された Java クライアントの使用:
例
import io.swagger.client.auth.*;
import io.swagger.client.model.*;
import io.swagger.client.api.PetApi;
public class Example {
public static void main(String[] args) {
ApiClient defaultClient = Configuration.getDefaultApiClient();
// APIキー認証を設定
ApiKeyAuth apiKey = (ApiKeyAuth) defaultClient.getAuthentication("api_key");
apiKey.setApiKey("YOUR API KEY");
PetApi apiInstance = new PetApi();
try {
Pet result = apiInstance.getPetById(789L);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling PetApi#getPetById");
e.printStackTrace();
}
}
}
Python クライアントの生成
Python クライアントを生成する:
swagger-codegen generate -i https://petstore.swagger.io/v2/swagger.json -l python -o ./python-client
Python クライアントの使用例:
例
from swagger_client.rest import ApiException
# APIクライアントインスタンスを作成
api_instance = swagger_client.PetApi()
api_client = api_instance.api_client
# APIキーを設定
api_client.configuration.api_key['api_key'] = 'YOUR_API_KEY'
try:
# 指定されたIDのペットを取得
pet = api_instance.get_pet_by_id(pet_id=789)
print(pet)
except ApiException as e:
print("Exception when calling PetApi->get_pet_by_id: %s\n" % e)
他の言語のサポート
Swagger Codegen は、以下を含むさまざまな言語とフレームワークをサポートしています(ただしこれらに限定されません):
- JavaScript/TypeScript(Node.js、Angular、Reactなど)
- Ruby
- PHP
- C#/.NET
- Go
- Swift
- Kotlin
- Scala
サポートされている言語のリストを表示:
swagger-codegen langs
サーバースタブコードの生成
Spring サーバーコードの生成
Spring Boot サーバースタブを生成する:
swagger-codegen generate \ -i https://petstore.swagger.io/v2/swagger.json \ -l spring \ -o ./spring-server
生成されたSpringサーバーコードの構造:
spring-server/ ├── pom.xml # Maven项目文件 ├── README.md # 说明文档 ├── src/ │ ├── main/ │ │ ├── java/ # 控制器接口和模型类 │ │ └── resources/ # 配置文件和静态资源 │ └── test/ # 测试代码 └── .gitignore
生成されたコントローラーインターフェースを実装:
例
public class PetApiController implements PetApi {
@Override
public ResponseEntity<Pet> getPetById(Long petId) {
// APIロジックを実装
Pet pet = new Pet();
pet.setId(petId);
pet.setName("サンプルのペット");
pet.setStatus(Pet.StatusEnum.AVAILABLE);
return ResponseEntity.ok(pet);
}
}
Node.js サーバーコードの生成
Node.js サーバーコードを生成する:
swagger-codegen generate \ -i https://petstore.swagger.io/v2/swagger.json \ -l nodejs-server \ -o ./nodejs-server
Node.js サーバーの使用例:
例
module.exports.getPetById = function(petId) {
return new Promise(function(resolve, reject) {
var examples = {};
examples['application/json'] = {
"id": petId,
"name": "サンプルのペット",
"status": "available"
};
resolve(examples[Object.keys(examples)[0]]);
});
}
OpenAPI Generator の応用
OpenAPI Generator vs Swagger Codegen
OpenAPI Generator は Swagger Codegen のフォークであり、2018年から独立して開発されています。主な利点は次のとおりです:
- より活発なコミュニティメンテナンス
- より広範なテンプレートサポート
- より優れたOpenAPI 3.0サポート
- より多くの設定オプションとカスタマイズ機能
OpenAPI Generator のインストール:
# 使用npm安装 npm install @openapitools/openapi-generator-cli -g # 使用Homebrew安装 brew install openapi-generator # 下载JAR文件 wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/6.0.1/openapi-generator-cli-6.0.1.jar -O openapi-generator-cli.jar
インストールと基本使用
基本的な使用方法:
# 显示帮助信息 openapi-generator help # 生成Java客户端 openapi-generator generate \ -i https://petstore.swagger.io/v2/swagger.json \ -g java \ -o ./java-client # 列出支持的生成器 openapi-generator list
カスタムテンプレート
テンプレートの基本知識
OpenAPI Generator は Mustache テンプレートエンジンを使用します。生成コードをカスタマイズするには、以下が必要です:
- デフォルトテンプレートを取得
- ニーズに合わせてテンプレートを変更
- カスタムテンプレートを使用してコードを生成
カスタムテンプレートを作成<# 使用JAR文件获取特定语言的模板
java -jar openapi-generator-cli.jar author template \
-g java \
-o ./custom-templates/java
テンプレートファイルの例(Java の api.mustache):
{{>licenseInfo}}
package {{package}};
{{#imports}}import {{import}};
{{/imports}}
{{#operations}}
public interface {{classname}} {
{{#operation}}
{{#summary}}
/**
* {{summary}}
* {{/summary}}
{{#notes}}
* {{notes}}
{{/notes}}
*/
{{#returnType}}{{returnType}} {{/returnType}}{{^returnType}}void {{/returnType}}{{operationId}}({{#allParams}}{{dataType}} {{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
{{/operation}}
}
{{/operations}}
テンプレートを適用してコードを生成
カスタムテンプレートを使用してコードを生成する:
openapi-generator generate \ -i https://petstore.swagger.io/v2/swagger.json \ -g java \ -o ./java-client-custom \ -t ./custom-templates/java
カスタム設定
グローバル設定オプション
OpenAPI Generator は複数のグローバル設定オプションをサポートしています:
openapi-generator generate \ -i spec.yaml \ -g java \ -o output \ --api-package com.example.api \ --model-package com.example.model \ --package-name com.example \ --git-repo-id my-repo \ --git-user-id my-username
言語固有の設定
生成器ごとに固有の設定オプションがあります:
# Java客户端生成器的特定选项 openapi-generator generate \ -i spec.yaml \ -g java \ -o output \ --library retrofit2 \ --java8 true \ --use-rx-java true
設定ファイルの使用
よく使う設定を保存する設定ファイルを作成できます:
config.json ファイル
"artifactId": "petstore-client",
"groupId": "com.example",
"library": "retrofit2",
"apiPackage": "com.example.api",
"modelPackage": "com.example.model",
"invokerPackage": "com.example.client",
"dateLibrary": "java8",
"java8": true
}
設定ファイルを使用する:
openapi-generator generate \ -i spec.yaml \ -g java \ -o output \ -c config.json
実践プロジェクト事例
ゼロから始めるAPI設計
Swagger Editor を使用して API を設計する:
- アクセスhttps://editor.swagger.io/
- OpenAPI 仕様ファイルを作成する:
例
info:
title:製品管理API
version: 1.0.0
description:製品を管理するためのRESTful API
servers:
- url: https://api.example.com/v1
paths:
/products:
get:
summary:製品リストの取得
responses:
'200':
description:成功
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Product'
post:
summary:新製品の作成
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ProductInput'
responses:
'201':
description:作成成功
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
/products/{productId}:
get:
summary:単一製品の取得
parameters:
- name: productId
in: path
required: true
schema:
type: string
responses:
'200':
description:成功
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
components:
schemas:
Product:
type: object
properties:
id:
type: string
name:
type: string
price:
type: number
category:
type: string
createdAt:
type: string
format: date-time
ProductInput:
type: object
required:
- name
- price
properties:
name:
type: string
price:
type: number
category:
type: string
完全なプロジェクトコード生成
設計したAPI仕様から完全なプロジェクトを生成する:
- API 仕様を保存:
product-api.yaml - フロントエンドとバックエンドのコードを生成する:
# 生成Spring Boot服务端 openapi-generator generate \ -i product-api.yaml \ -g spring \ -o ./product-service \ --additional-properties=java8=true,dateLibrary=java8 # 生成React前端 openapi-generator generate \ -i product-api.yaml \ -g typescript-fetch \ -o ./product-frontend \ --additional-properties=supportsES6=true,npmName=product-api-client
よくある問題と解決方法
-
生成されたコードがコンパイルできない
- OpenAPI仕様が標準に準拠していることを確認する
- カスタムテンプレートの構文エラーを確認する
- ジェネレーターを最新版に更新する
-
カスタムテンプレートが反映されない
- テンプレートのパスが正しいことを確認する
- テンプレートのファイル名が元のテンプレートと一致しているか確認する
- 相対パスではなく絶対パスを使用する
-
生成されたコードに特定の機能が欠けている
- OpenAPI仕様が必要な機能を完全に定義しているか確認する
- 正しいジェネレーターと設定オプションを使用しているか確認する
- カスタムテンプレートを使用して追加機能を追加することを検討する
-
生成されたコードが既存のプロジェクトと互換性がない
- 設定オプションを使用してパッケージ名と命名規則を調整する
- カスタムテンプレートでコードスタイルを調整する
- APIインターフェースのみを生成し、具体的なロジックは手動で実装することを検討する
高度な機能とベストプラクティス
バージョン管理
API バージョン管理のベストプラクティス:
- OpenAPI仕様でバージョン番号を明確にする
- セマンティックバージョニング(SemVer)を使用する
- APIのバージョンごとに異なるベースパスを使用する
- すべてのバージョンの仕様ファイルを保存する
CI/CD 統合
コード生成を CI/CD パイプラインに統合する:
例
name: Generate API Client
on:
push:
paths:
- 'api-specs/**'
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Install OpenAPI Generator
run: npm install @openapitools/openapi-generator-cli -g
- name: Generate Client
run: |
openapi-generator generate \
-i api-specs/product-api.yaml \
-g typescript-fetch \
-o ./generated-client
- name: Commit and Push
run: |
git config --global user.name 'GitHub Actions'
git config --global user.email '[email protected]'
git add ./generated-client
git commit -m "Auto-generate API client"
git push
エンタープライズ向けアプリケーションの提案
エンタープライズプロジェクトの場合:
-
API仕様を一元管理する
- API仕様を専用のGitリポジトリで管理する
- 品質を確保するためにコードレビュープロセスを実施する
-
生成コードのスタイルガイドを確立する
- 一貫した命名規則を作成する
- エラーハンドリングの標準を策定する
- 統一された認証処理方法を設計する
-
生成コードと手書きコードを併用する
- 基本フレームワークとデータモデルを生成する
- 複雑なビジネスロジックは手動で実装する
- アダプターパターンを使用して生成コードと手書きコードを分離する
-
マイクロサービスアーキテクチャを検討する
- 各マイクロサービスごとに独立したAPI仕様を維持する
- APIゲートウェイを使用して外部インターフェースを統一する
- コード生成によりサービス間のクライアントを実現する