Swagger/OpenAPI Generation for C++: How to Automate REST API Creation
Modern web development in C++ requires efficient tools for creating REST APIs. The OpenAPI specification (formerly Swagger) has become the standard for describing web service interfaces. However, automatic code generation in C++ from OpenAPI specifications is a non-trivial task. In this article, we will review the best libraries and tools that will help you generate server and client code in C++ from OpenAPI documents.
Why Does C++ Lag Behind Other Languages in OpenAPI Generation?
Unlike Python, Java, or JavaScript, where mature generators exist (e.g., openapi-generator), C++ faces several challenges:
- Lack of a unified HTTP framework standard — C++ has no dominant web framework like Flask or Spring.
- Memory management complexity — generating safe code with smart pointers requires additional templates.
- Type diversity — JSON serialization in C++ requires manual configuration for complex structures.
Main Tools for Generating C++ Code from OpenAPI
1. OpenAPI Generator (Official Generator)
The most popular tool is OpenAPI Generator (formerly Swagger Codegen). It supports many languages, including C++. However, its C++ support is limited: it only generates client code based on cpprestsdk (Casablanca) or Qt.
Installation:
# Via npmnpm install @openapitools/openapi-generator-cli -g
# Generate C++ client (cpprestsdk)openapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./clientExample of generated code (Qt):
// PetApi.hclass PetApi : public AbstractOpenAPISchema { Q_OBJECTpublic: explicit PetApi(QObject *parent = nullptr); void addPet(const Pet &body); void getPetById(qint64 petId); signals: void addPetSignal(Pet &result); void getPetByIdSignal(Pet &result);};Pros: Support for many formats, active community.
Cons: Generated code often requires refinement; no server-side generation for C++.
2. oat++ (oatpp) — Framework with OpenAPI Support
oat++ is a modern C++ framework for creating REST APIs that includes built-in OpenAPI support. Unlike generators, oat++ uses a declarative approach with annotations.
Example of endpoint description:
ENDPOINT("GET", "/users/{userId}", getUser) { auto userId = req->getPathVariable("userId"); auto user = userService->getUser(userId); // Automatic OpenAPI documentation auto dto = UserDto::createShared(); dto->id = user->id; dto->name = user->name; return createDtoResponse(Status::CODE_200, dto);}Oat++ automatically generates openapi.yaml based on annotations. This allows you not to write the specification manually, but to derive it from the code.
3. Restbed + Swagger UI
Restbed is a lightweight HTTP framework for C++11. Paired with the restbed-swagger library, you can dynamically generate OpenAPI documentation.
#include <restbed>#include <restbed-swagger>
auto resource = std::make_shared<restbed::Resource>();resource->set_path("/api/users/{id}");
// Parameter description for Swaggerrestbed::swagger::Info info;info.set_title("User API");info.set_version("1.0.0");
auto swagger = std::make_shared<restbed::swagger::Service>(info);swagger->publish(resource);4. Crow — Microframework with OpenAPI Extension
Crow —