Swagger/OpenAPI Generierung für Kotlin: Von der Spezifikation zum fertigen Code
\n\nDie Entwicklung moderner APIs erfordert eine klare Dokumentation und eine schnelle Generierung von Client- und Server-Code. Swagger/OpenAPI ist ein Standard zur Beschreibung von RESTful-Schnittstellen, der es ermöglicht, automatisch Code in Kotlin zu erstellen und den Entwickler so von der Routinearbeit des Schreibens von DTOs, Controllern und Clients zu befreien. In diesem Artikel werden wir die wichtigsten Werkzeuge, Konfigurationsbeispiele und praktische Anwendungsszenarien durchgehen.
\n\nWas ist OpenAPI und warum braucht ein Kotlin-Entwickler es?
\n\nOpenAPI (früher Swagger) ist eine Spezifikation im YAML- oder JSON-Format, die Endpunkte, Datenmodelle, Anfrage- und Antwortparameter beschreibt. Für Kotlin bietet die Codegenerierung aus OpenAPI:
\n- \n
- Automatisierung — Erstellung von data-Klassen, Enums, Controller-Interfaces \n
- Konsistenz — Code entspricht immer der Dokumentation \n
- Zeitersparnis — keine manuelle Serialisierung/Deserialisierung nötig \n
- Framework-Unterstützung — Ktor, Spring Boot, Retrofit, Micronaut \n
Wichtigste Generierungswerkzeuge
\n\nFür Kotlin gibt es mehrere ausgereifte Lösungen:
\n\n1. OpenAPI Generator (offizieller Generator)
\nDas beliebteste Werkzeug. Unterstützt Dutzende von Sprachen und Frameworks. Für Kotlin sind folgende Generatoren verfügbar:
\n- \n
kotlin-client— Client auf Basis von Ktor oder Retrofit \n kotlin-server— Server auf Basis von Ktor oder Spring \n kotlin-spring— Spring Boot Controller \n
2. Ktor OpenAPI Plugin
\nEin Plugin für das Ktor-Framework, das OpenAPI-Dokumentation aus Code generiert (umgekehrter Ansatz).
\n\n3. Swagger Codegen (Legacy)
\nDer Vorgänger des OpenAPI Generators, wird immer noch verwendet, aber es wird empfohlen, auf die neue Version zu migrieren.
\n\nBeispiel: Generierung eines Kotlin-Clients aus einer OpenAPI-Spezifikation
\n\nBetrachten wir ein praktisches Beispiel. Angenommen, wir haben eine Datei petstore.yaml (die Standard-Petstore-Spezifikation). Wir generieren einen Kotlin-Client mit dem OpenAPI Generator.
Schritt 1: Installation des OpenAPI Generators
\nÜber Homebrew (macOS/Linux):
\nbrew install openapi-generator\nOder über Docker:
\ndocker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate \\\n -i /local/petstore.yaml \\\n -g kotlin-client \\\n -o /local/out/kotlin-client\n\nSchritt 2: Konfiguration der Generierung
\nErstellen wir eine Konfigurationsdatei config.json:
{\n "packageName": "com.pythonlib.petstore.client",\n "library": "ktor",\n "serializationLibrary": "kotlinx_serialization",\n "useCoroutines": true\n}\n\nSchritt 3: Start der Generierung
\nopenapi-generator generate \\\n -i petstore.yaml \\\n -g kotlin-client \\\n -o ./generated-client \\\n -c config.json\n\nErgebnis: Generierter Code
\nIm Ordner generated-client erscheinen:
- \n
src/main/kotlin/com/pythonlib/petstore/client/models/Pet.kt\n src/main/kotlin/com/pythonlib/petstore/client/api/PetApi.kt\n
Beispiel eines generierten DTOs:
\n@Serializable\ndata class Pet(\n val id: Long? = null,\n @SerialName("category")\n val category: Category? = null,\n @SerialName("name")\n val name: String,\n @SerialName("photoUrls")\n val photoUrls: List<String>,\n val tags: List<Tag>? = null,\n val status: PetStatus? = null\n)\n\n@Serializable\nenum class PetStatus {\n @SerialName("available")\n Available,\n @SerialName("pending")\n Pending,\n @SerialName("sold")\n Sold\n}\n\nBeispiel eines generierten API-Clients (Ktor):
\nclass PetApi(private val client: HttpClient) {\n\n suspend fun addPet(pet: Pet): Pet = cli