Geração Swagger/OpenAPI para C++: como automatizar a criação de REST API
O desenvolvimento web moderno em C++ exige ferramentas eficientes para criar REST APIs. A especificação OpenAPI (anteriormente Swagger) tornou-se o padrão para descrever interfaces de serviços web. No entanto, a geração automática de código C++ a partir de especificações OpenAPI é uma tarefa desafiadora. Neste artigo, analisaremos as melhores bibliotecas e ferramentas que o ajudarão a gerar código de servidor e cliente em C++ a partir de documentos OpenAPI.
Por que o C++ está atrás de outras linguagens na geração OpenAPI?
Ao contrário de Python, Java ou JavaScript, onde existem geradores maduros (por exemplo, openapi-generator), o C++ enfrenta vários problemas:
- Falta de um padrão único para frameworks HTTP — em C++ não há um framework web dominante como Flask ou Spring.
- Complexidade do gerenciamento de memória — a geração de código seguro com ponteiros inteligentes requer modelos adicionais.
- Diversidade de tipos — a serialização JSON em C++ requer configuração manual para estruturas complexas.
Principais ferramentas para geração de código C++ a partir de OpenAPI
1. OpenAPI Generator (gerador oficial)
A ferramenta mais popular é o OpenAPI Generator (anteriormente Swagger Codegen). Ele suporta várias linguagens, incluindo C++. No entanto, seu suporte para C++ é limitado: apenas código cliente é gerado com base em cpprestsdk (Casablanca) ou Qt.
Instalação:
# Via npmnpm install @openapitools/openapi-generator-cli -g
# Geração de cliente C++ (cpprestsdk)openapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./clientExemplo de código gerado (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);};Prós: Suporte a múltiplos formatos, comunidade ativa.
Contras: O código gerado frequentemente requer ajustes; não há geração de servidor para C++.
2. oat++ (oatpp) — framework com suporte a OpenAPI
oat++ é um framework C++ moderno para criar REST APIs que inclui suporte embutido para OpenAPI. Ao contrário dos geradores, o oat++ usa uma abordagem declarativa com anotações.
Exemplo de descrição de endpoint:
ENDPOINT("GET", "/users/{userId}", getUser) { auto userId = req->getPathVariable("userId"); auto user = userService->getUser(userId); // Documentação automática OpenAPI auto dto = UserDto::createShared(); dto->id = user->id; dto->name = user->name; return createDtoResponse(Status::CODE_200, dto);}O oat++ gera automaticamente openapi.yaml com base nas anotações. Isso permite não escrever a especificação manualmente, mas derivá-la do código.
3. Restbed + Swagger UI
Restbed é um framework HTTP leve para C++11. Combinado com a biblioteca restbed-swagger, é possível gerar dinamicamente documentação OpenAPI.
#include <restbed>#include <restbed-swagger>
auto resource = std::make_shared<restbed::Resource>();resource->set_path("/api/users/{id}");
// Descrição de parâmetros para 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 com extensão OpenAPI
Crow —