Swagger/OpenAPI-Generierung für C++: Überblick über Tools und Bibliotheken
Die moderne Entwicklung von Serveranwendungen in C++ kommt selten ohne REST-API aus. Die Spezifikation OpenAPI (früher bekannt als Swagger) hat sich zum Industriestandard für die Beschreibung von Schnittstellen zwischen Client und Server entwickelt. Das manuelle Schreiben von Code zur Verarbeitung von Anfragen, Datenvalidierung und Generierung von Antworten ist jedoch ein zeitaufwändiger und fehleranfälliger Prozess. Glücklicherweise bietet das C++-Ökosystem mehrere ausgereifte Lösungen zur automatischen Codegenerierung aus OpenAPI-Spezifikationen. In diesem Artikel betrachten wir die wichtigsten Tools, ihre Stärken und geben praktische Beispiele.
1. OpenAPI Generator (openapi-generator.tech)
Der beliebteste universelle Codegenerator für Dutzende von Sprachen, einschließlich C++. Unterstützt OpenAPI 3.0 und 3.1. Ermöglicht die Generierung von sowohl Servercode (C++ REST SDK / cpprestsdk, Pistache, Restbed) als auch Clientcode.
Installation
npm install @openapitools/openapi-generator-cli -g# oder über Docker:docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate \ -i /local/petstore.yaml \ -g cpp-restsdk \ -o /local/out/cpp-clientBeispiel für die Generierung eines Clients mit cpprestsdk
Angenommen, Sie haben eine Datei petstore.yaml mit der API-Beschreibung für einen Tierhandel. Nach der Generierung erhalten Sie fertige Klassen:
#include "ApiClient.h"#include "PetApi.h"
int main() { auto client = std::make_shared<ApiClient>(); PetApi api(client);
api.getPetById(1).then([](std::shared_ptr<Pet> pet) { std::cout << "Pet name: " << pet->getName() << std::endl; }).wait(); return 0;}Vorteile: riesige Community, Unterstützung vieler Frameworks, aktive Entwicklung.
Nachteile: generierter Code kann überflüssig sein, erfordert manuelle Anpassung an das jeweilige Framework.
2. oat++ (oatpp.io)
Modernes Framework für C++ mit eigener Unterstützung für OpenAPI 3.0. Im Gegensatz zu OpenAPI Generator generiert oat++ keinen Code aus der Spezifikation, sondern ermöglicht es, bereits geschriebene Endpunkte zu annotieren und automatisch eine OpenAPI-Spezifikation zu exportieren.
Beispiel für eine Endpunkt-Annotation
ENDPOINT("GET", "/pets/{petId}", getPetById) { auto dto = PetDto::createShared(); dto->id = request->getPathVariable("petId"); dto->name = "Rex"; dto->status = "available"; return createDtoResponse(Status::CODE_200, dto);}
// DTO-BeschreibungDTO(PetDto, FIELD(Int32, id, "id"), FIELD(String, name, "name"), FIELD(String, status, "status"));Danach generiert oat++ automatisch openapi.json zur Laufzeit. Für die statische Generierung wird das Dienstprogramm oatpp-swagger verwendet.
Vorteile: nativer Ansatz, einheitliches Framework, hervorragende Dokumentation, integrierte Unterstützung für Swagger UI.
Nachteile: erfordert die vollständige Verwendung von oat++, nicht geeignet für bestehende Projekte mit anderen Frameworks.
3. Drogon (drogon.org)
Hochleistungsfähiges asynchrones Web-Framework für C++17/20. Enthält das Modul drogon_ctl zur Generierung eines Projektgerüsts und das Plugin drogon::OpenApiPlugin zur automatischen Generierung der OpenAPI 3.0-Dokumentation.
Beispiel für die Verwendung von OpenApiPlugin
#include <drogon/drogon.h>using namespace drogon;
int main() { app().registerController(std::make_shared<PetController>()); app().addPlugin("drogon::OpenApiPlugin", { {"title", "Pet Store API"}, {"version", "1.0.0"} }); app().run();}Controller mit automatischer Dokumentation:
class PetController : public HttpController<PetController> {public: MET Auch in der Bibliothek
Rate Limiting in Rust: Bibliotheken zur Begrenzung der Anfragefrequenz
parking_lot für Rust: Vollständige Anleitung mit Beispielen
mockery für Go: Vollständige Anleitung mit Beispielen
Arbeiten mit Bildern in Go (Golang): Bibliotheken und Beispiele
godotenv für Go: Vollständige Anleitung mit Beispielen