Swagger Codegen (Codegenerierung)
Swagger ist eine Sammlung von Open-Source-Tools, die rund um die OpenAPI-Spezifikation (früher als Swagger-Spezifikation bekannt) entwickelt wurden und zum Entwerfen, Erstellen, Dokumentieren und Konsumieren von RESTful-Webdiensten verwendet werden.
Swagger umfasst hauptsächlich:
- Swagger Editor: Ein browserbasierter Editor, mit dem Sie OpenAPI-Spezifikationen schreiben können
- Swagger UI: Eine visuelle API-Dokumentationsoberfläche, die Entwicklern ermöglicht, APIs interaktiv zu erkunden
- Swagger Codegen: Generiert automatisch Client-Code und Server-Stubs basierend auf der OpenAPI-Spezifikation
Die OpenAPI-Spezifikation ist ein sprachunabhängiges Definitionsformat zur Beschreibung von RESTful-APIs.
OpenAPI ermöglicht es sowohl Menschen als auch Computern, die Fähigkeiten eines Dienstes zu entdecken und zu verstehen, ohne dass Zugriff auf Quellcode oder zusätzliche Dokumentation erforderlich ist.
Swagger Codegen (Codegenerierung)
Umgebungsvorbereitung
Bevor Sie beginnen, stellen Sie sicher, dass Folgendes auf Ihrem System installiert ist:
- Java 8+
- Maven (für Java-Projekte)
- Git (zum Abrufen des Quellcodes)
Swagger Codegen installieren:
# 方法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
Client-SDK generieren
Java-Client-Generierung
Verwenden Sie die Petstore-API als Beispiel, um einen Java-Client zu generieren:
# 使用命令行工具 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
Die Struktur des generierten Client-SDK:
java-client/ ├── pom.xml # Maven项目文件 ├── README.md # 说明文档 ├── src/ │ ├── main/ │ │ ├── java/ # 生成的Java代码 │ │ └── resources/ # 配置文件 │ └── test/ # 测试代码 └── .gitignore
Verwendung des generierten Java-Clients:
Beispiel
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-Schlüssel-Authentifizierung konfigurieren
ApiKeyAuth apiKey = (ApiKeyAuth) defaultClient.getAuthentication("api_key");
apiKey.setApiKey("DEIN API-SCHLÜSSEL");
PetApi apiInstance = new PetApi();
try {
Pet result = apiInstance.getPetById(789L);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Ausnahme beim Aufruf von PetApi#getPetById");
e.printStackTrace();
}
}
}
Python-Client-Generierung
Python-Client generieren:
swagger-codegen generate -i https://petstore.swagger.io/v2/swagger.json -l python -o ./python-client
Anwendungsbeispiel für den Python-Client:
Beispiel
from swagger_client.rest import ApiException
# API-Client-Instanz erstellen
api_instance = swagger_client.PetApi()
api_client = api_instance.api_client
# API-Schlüssel festlegen
api_client.configuration.api_key['api_key'] = 'YOUR_API_KEY'
try:
# Das Haustier mit der angegebenen ID abrufen
pet = api_instance.get_pet_by_id(pet_id=789)
print(pet)
except ApiException as e:
print("Ausnahme beim Aufrufen von PetApi->get_pet_by_id: %s\n" % e)
Unterstützung für andere Sprachen
Swagger Codegen unterstützt mehrere Sprachen und Frameworks, einschließlich, aber nicht beschränkt auf:
- JavaScript/TypeScript (Node.js, Angular, React, usw.)
- Ruby
- PHP
- C#/.NET
- Go
- Swift
- Kotlin
- Scala
Liste der unterstützten Sprachen anzeigen:
swagger-codegen langs
Server-Stub-Code generieren
Generierung von Spring-Server-Code
Generieren Sie einen Spring-Boot-Server-Stub:
swagger-codegen generate \ -i https://petstore.swagger.io/v2/swagger.json \ -l spring \ -o ./spring-server
Die Struktur des generierten Spring-Server-Codes:
spring-server/ ├── pom.xml # Maven项目文件 ├── README.md # 说明文档 ├── src/ │ ├── main/ │ │ ├── java/ # 控制器接口和模型类 │ │ └── resources/ # 配置文件和静态资源 │ └── test/ # 测试代码 └── .gitignore
Implementieren Sie die generierte Controller-Schnittstelle:
Beispiel
public class PetApiController implements PetApi {
@Override
public ResponseEntity<Pet> getPetById(Long petId) {
// API-Logik implementieren
Pet pet = new Pet();
pet.setId(petId);
pet.setName("sample pet");
pet.setStatus(Pet.StatusEnum.AVAILABLE);
return ResponseEntity.ok(pet);
}
}
Node.js-Server-Codegenerierung
Node.js-Servercode generieren:
swagger-codegen generate \ -i https://petstore.swagger.io/v2/swagger.json \ -l nodejs-server \ -o ./nodejs-server
Verwendungsbeispiel für den Node.js-Server:
Beispiel
module.exports.getPetById = function(petId) {
return new Promise(function(resolve, reject) {
var examples = {};
examples['application/json'] = {
"id": petId,
"name": "sample pet",
"status": "available"
};
resolve(examples[Object.keys(examples)[0]]);
});
}
OpenAPI Generator Erweitert
OpenAPI Generator vs Swagger Codegen
OpenAPI Generator ist ein Fork von Swagger Codegen, der 2018 mit der unabhängigen Entwicklung begann. Zu den wichtigsten Vorteilen gehören:
- Aktivere Community-Wartung
- Breitere Template-Unterstützung
- Bessere Unterstützung für OpenAPI 3.0
- Mehr Konfigurationsoptionen und Anpassungsmöglichkeiten
OpenAPI Generator installieren:
# 使用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
Installation und grundlegende Verwendung
Grundlegende Verwendung:
# 显示帮助信息 openapi-generator help # 生成Java客户端 openapi-generator generate \ -i https://petstore.swagger.io/v2/swagger.json \ -g java \ -o ./java-client # 列出支持的生成器 openapi-generator list
Benutzerdefinierte Templates
Template-Grundlagen
OpenAPI Generator verwendet die Mustache-Template-Engine. Um den generierten Code anzupassen, müssen Sie:
- Standard-Templates abrufen
- Templates an Ihre Bedürfnisse anpassen
- Code mit benutzerdefinierten Templates generieren
Benutzerdefinierte Templates erstellen<# 使用JAR文件获取特定语言的模板
java -jar openapi-generator-cli.jar author template \
-g java \
-o ./custom-templates/java
Beispiel einer Template-Datei (Java's 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}}
Vorlage anwenden, um Code zu generieren
Code mithilfe benutzerdefinierter Vorlagen generieren:
openapi-generator generate \ -i https://petstore.swagger.io/v2/swagger.json \ -g java \ -o ./java-client-custom \ -t ./custom-templates/java
Benutzerdefinierte Konfiguration
Globale Konfigurationsoptionen
OpenAPI Generator unterstützt verschiedene globale Konfigurationsoptionen:
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
Sprachspezifische Konfiguration
Verschiedene Generatoren haben ihre eigenen spezifischen Konfigurationsoptionen:
# Java客户端生成器的特定选项 openapi-generator generate \ -i spec.yaml \ -g java \ -o output \ --library retrofit2 \ --java8 true \ --use-rx-java true
Verwenden von Konfigurationsdateien
Sie können eine Konfigurationsdatei erstellen, um allgemeine Einstellungen zu speichern:
config.json-Datei
"artifactId": "petstore-client",
"groupId": "com.example",
"library": "retrofit2",
"apiPackage": "com.example.api",
"modelPackage": "com.example.model",
"invokerPackage": "com.example.client",
"dateLibrary": "java8",
"java8": true
}
Verwenden einer Konfigurationsdatei:
openapi-generator generate \ -i spec.yaml \ -g java \ -o output \ -c config.json
Praktische Projektbeispiele
API-Design von Grund auf
Entwerfen Sie Ihre API mit dem Swagger Editor:
- Besuchen Siehttps://editor.swagger.io/
- Erstellen Sie eine OpenAPI-Spezifikationsdatei:
Beispiel
Info:
title:Produktmanagement-API
version: 1.0.0
description:Eine RESTful-API zur Verwaltung von Produkten
servers:
- url: https://api.example.com/v1
paths:
/products:
get:
summary:Produktliste abrufen
responses:
'200':
description:Erfolg
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Product'
post:
summary:Ein neues Produkt erstellen
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/ProductInput'
responses:
'201':
description:Erstellung erfolgreich
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
/products/{productId}:
get:
summary:Ein einzelnes Produkt abrufen
parameters:
- name: productId
in: path
required: true
schema:
type: string
responses:
'200':
description:Erfolg
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
components:
schemas:
Produkt:
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
Vollständige Projektcode-Generierung
Generieren Sie ein vollständiges Projekt aus der entworfenen API-Spezifikation:
- Speichern Sie die API-Spezifikation als
product-api.yaml - Generieren Sie Frontend- und Backend-Code:
# 生成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
Häufige Probleme und Lösungen
-
Generierter Code kann nicht kompiliert werden
- Stellen Sie sicher, dass die OpenAPI-Spezifikation den Standards entspricht
- Benutzerdefinierte Vorlagen auf Syntaxfehler prüfen
- Auf die neueste Version des Generators aktualisieren
-
Benutzerdefinierte Vorlagen werden nicht wirksam
- Stellen Sie sicher, dass der Vorlagenpfad korrekt ist
- Prüfen Sie, ob der Name der Vorlagendatei mit der Originalvorlage übereinstimmt
- Verwenden Sie absolute Pfade anstelle von relativen Pfaden
-
Im generierten Code fehlen bestimmte Funktionen
- Prüfen Sie, ob die OpenAPI-Spezifikation die erforderliche Funktionalität vollständig definiert
- Bestätigen Sie, dass der richtige Generator und die richtigen Konfigurationsoptionen verwendet werden
- Erwägen Sie, benutzerdefinierte Vorlagen zu verwenden, um zusätzliche Funktionalität hinzuzufügen
-
Der generierte Code ist nicht mit bestehenden Projekten kompatibel
- Verwenden Sie Konfigurationsoptionen, um Paketnamen und Namenskonventionen anzupassen
- Passen Sie den Codestil mithilfe benutzerdefinierter Vorlagen an
- Erwägen Sie, nur die API-Schnittstellen zu generieren und die spezifische Logik manuell zu implementieren
Erweiterte Funktionen und Best Practices
Versionsverwaltung
Bewährte Methoden für die Verwaltung von API-Versionen:
- Die Versionsnummer in der OpenAPI-Spezifikation eindeutig angeben
- Semantische Versionierung (SemVer) verwenden
- Unterschiedliche Basispfade für verschiedene Versionen der API verwenden
- Spezifikationsdateien für alle Versionen speichern
CI/CD-Integration
Codegenerierung in die CI/CD-Pipeline integrieren:
Beispiel
name: API-Client generieren
auf:
push:
paths:
- 'api-specs/**'
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: JDK einrichten
uses: actions/setup-java@v2
with:
java-version: '11'
- name: OpenAPI Generator installieren
run: npm install @openapitools/openapi-generator-cli -g
- name: Client generieren
run: |
openapi-generator generate \
-i api-specs/product-api.yaml \
-g typescript-fetch \
-o ./generated-client
- name: Commit und Push
run: |
git config --global user.name 'GitHub Actions'
git config --global user.email '[email protected]'
git add ./generiert-Client
git commit -m "API-Client automatisch generieren"
git push
Empfehlungen für Unternehmensanwendungen
Für Projekte auf Unternehmensebene:
-
API-Spezifikationen zentral verwalten
- Ein dediziertes Git-Repository zur Verwaltung von API-Spezifikationen verwenden
- Einen Code-Review-Prozess implementieren, um die Qualität zu gewährleisten
-
Einen Styleguide für generierten Code erstellen
- Konsistente Namenskonventionen erstellen
- Standards für die Fehlerbehandlung definieren
- Einen einheitlichen Ansatz für die Authentifizierungsbehandlung entwerfen
-
Generierten Code und handgeschriebenen Code mischen
- Das grundlegende Framework und die Datenmodelle generieren
- Komplexe Geschäftslogik manuell implementieren
- Das Adapter-Muster verwenden, um generierten Code und handgeschriebenen Code zu isolieren
-
Eine Microservices-Architektur in Betracht ziehen
- Unabhängige API-Spezifikationen für jeden Microservice pflegen
- Ein API-Gateway verwenden, um externe Schnittstellen zu vereinheitlichen
- Client-Code zwischen Diensten durch Codegenerierung implementieren