Swagger/OpenAPI Generierung für C++: Wie man die Erstellung von REST APIs automatisiert
\n\nModerne Webentwicklung mit C++ erfordert effiziente Werkzeuge zur Erstellung von REST APIs. Die OpenAPI-Spezifikation (früher Swagger) hat sich als Standard für die Beschreibung von Webservice-Schnittstellen etabliert. Die automatische Codegenerierung in C++ aus OpenAPI-Spezifikationen ist jedoch eine anspruchsvolle Aufgabe. In diesem Artikel analysieren wir die besten Bibliotheken und Tools, die Ihnen helfen, Server- und Client-Code in C++ aus OpenAPI-Dokumenten zu generieren.
\n\nWarum hinkt C++ bei der OpenAPI-Generierung hinter anderen Sprachen hinterher?
\nIm Gegensatz zu Python, Java oder JavaScript, für die es ausgereifte Generatoren gibt (z.B. openapi-generator), steht C++ vor mehreren Herausforderungen:
- \n
- Fehlen eines einheitlichen Standards für HTTP-Frameworks — in C++ gibt es kein dominierendes Webframework wie Flask oder Spring. \n
- Komplexität der Speicherverwaltung — die Generierung von sicherem Code mit Smart Pointern erfordert zusätzliche Vorlagen. \n
- Vielfalt der Typen — JSON-Serialisierung in C++ erfordert manuelle Konfiguration für komplexe Strukturen. \n
Wichtigste Tools zur Generierung von C++-Code aus OpenAPI
\n\n1. OpenAPI Generator (offizieller Generator)
\nDas bekannteste Tool ist der OpenAPI Generator (früher Swagger Codegen). Er unterstützt viele Sprachen, einschließlich C++. Allerdings ist seine C++-Unterstützung eingeschränkt: Es wird nur Client-Code auf Basis von cpprestsdk (Casablanca) oder Qt generiert.
\nInstallation:
\n# Über npm\nnpm install @openapitools/openapi-generator-cli -g\n\n# Generierung eines C++-Clients (cpprestsdk)\nopenapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./client\nBeispiel für generierten Code (Qt):
\n// PetApi.h\nclass PetApi : public AbstractOpenAPISchema {\n Q_OBJECT\npublic:\n explicit PetApi(QObject *parent = nullptr);\n \n void addPet(const Pet &body);\n void getPetById(qint64 petId);\n \nsignals:\n void addPetSignal(Pet &result);\n void getPetByIdSignal(Pet &result);\n};\nVorteile: Unterstützung vieler Formate, aktive Community.
\nNachteile: Der generierte Code erfordert oft Nacharbeit; keine Server-Generierung für C++.
2. oat++ (oatpp) — Framework mit OpenAPI-Unterstützung
\noat++ ist ein modernes C++-Framework zur Erstellung von REST APIs, das integrierte OpenAPI-Unterstützung bietet. Im Gegensatz zu Generatoren verwendet oat++ einen deklarativen Ansatz mit Annotationen.
\nBeispiel für die Beschreibung eines Endpunkts:
\nENDPOINT("GET", "/users/{userId}", getUser) {\n auto userId = req->getPathVariable("userId");\n auto user = userService->getUser(userId);\n \n // Automatische OpenAPI-Dokumentation\n auto dto = UserDto::createShared();\n dto->id = user->id;\n dto->name = user->name;\n return createDtoResponse(Status::CODE_200, dto);\n}\nOat++ generiert automatisch openapi.yaml basierend auf den Annotationen. Dadurch muss die Spezifikation nicht manuell geschrieben werden, sondern wird aus dem Code abgeleitet.
3. Restbed + Swagger UI
\nRestbed ist ein leichtgewichtiges HTTP-Framework für C++11. In Kombination mit der Bibliothek restbed-swagger kann dynamisch eine OpenAPI-Dokumentation generiert werden.
\n#include <restbed>\n#include <restbed-swagger>\n\nauto resource = std::make_shared<restbed::Resource>();\nresource->set_path("/api/users/{id}");\n\n// Beschreibung der Parameter für Swagger\nrestbed::swagger::Info info;\ninfo.set_title("User API");\ninfo.set_version("1.0.0");\n\nauto swagger = std::make_shared<restbed::swagger::Service>(info);\nswagger->publish(resource);\n\n4. Crow — Mikroframework mit OpenAPI-Erweiterung
\nCrow ist ein