Swagger/OpenAPI генерация для C++: лучшие инструменты и библиотеки

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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, "Имя для приветствия")
    )                    

Рекомендаций