Swagger/OpenAPI-Generierung für C++: Überblick über Tools und Bibliotheken

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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-client


Beispiel 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                    

Empfehlungen