Swagger/OpenAPI генерация для C++: как автоматизировать создание REST API
Современная веб-разработка на C++ требует эффективных инструментов для создания REST API. Спецификация OpenAPI (ранее Swagger) стала стандартом для описания интерфейсов веб-сервисов. Однако автоматическая генерация кода на C++ по OpenAPI-спецификациям — задача нетривиальная. В этой статье мы разберём лучшие библиотеки и инструменты, которые помогут вам сгенерировать серверный и клиентский код на C++ из OpenAPI-документов.
Почему C++ отстаёт от других языков в OpenAPI-генерации?
В отличие от Python, Java или JavaScript, где существуют зрелые генераторы (например, openapi-generator), C++ сталкивается с несколькими проблемами:
- Отсутствие единого стандарта HTTP-фреймворков — в C++ нет доминирующего веб-фреймворка, как Flask или Spring.
- Сложность управления памятью — генерация безопасного кода с умными указателями требует дополнительных шаблонов.
- Разнообразие типов — JSON-сериализация в C++ требует ручной настройки для сложных структур.
Основные инструменты для генерации C++ кода из OpenAPI
1. OpenAPI Generator (официальный генератор)
Самый популярный инструмент — OpenAPI Generator (ранее Swagger Codegen). Он поддерживает множество языков, включая C++. Однако его поддержка C++ ограничена: генерируется только клиентский код на основе cpprestsdk (Casablanca) или Qt.
Установка:
# Через npm
npm install @openapitools/openapi-generator-cli -g
# Генерация C++ клиента (cpprestsdk)
openapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./client
Пример сгенерированного кода (Qt):
// PetApi.h
class PetApi : public AbstractOpenAPISchema {
Q_OBJECT
public:
explicit PetApi(QObject *parent = nullptr);
void addPet(const Pet &body);
void getPetById(qint64 petId);
signals:
void addPetSignal(Pet &result);
void getPetByIdSignal(Pet &result);
};
Плюсы: Поддержка множества форматов, активное сообщество.
Минусы: Сгенерированный код часто требует доработки; нет серверной генерации для C++.
2. oat++ (oatpp) — фреймворк с OpenAPI-поддержкой
oat++ — современный C++ фреймворк для создания REST API, который включает встроенную поддержку OpenAPI. В отличие от генераторов, oat++ использует декларативный подход с аннотациями.
Пример описания эндпоинта:
ENDPOINT("GET", "/users/{userId}", getUser) {
auto userId = req->getPathVariable("userId");
auto user = userService->getUser(userId);
// Автоматическая документация OpenAPI
auto dto = UserDto::createShared();
dto->id = user->id;
dto->name = user->name;
return createDtoResponse(Status::CODE_200, dto);
}
Oat++ автоматически генерирует openapi.yaml на основе аннотаций. Это позволяет не писать спецификацию вручную, а выводить её из кода.
3. Restbed + Swagger UI
Restbed — лёгкий HTTP-фреймворк для C++11. В паре с библиотекой restbed-swagger можно динамически генерировать OpenAPI-документацию.
#include <restbed>
#include <restbed-swagger>
auto resource = std::make_shared<restbed::Resource>();
resource->set_path("/api/users/{id}");
// Описание параметров для Swagger
restbed::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 — микрофреймворк с OpenAPI-расширением
Crow — один из самых быстрых HTTP-фреймворков для C++. Существует форк Crow-OpenAPI, который добавляет поддержку OpenAPI через макросы.
#include "crow_all.h"
#include "crow_openapi.h"
int main() {
crow::SimpleApp app;
CROW_OPENAPI_ROUTE(app, "/hello")
.methods("GET"_method)
.parameters(
crow::openapi::query_param("name", "string", true, "Имя для приветствия")
)