Swagger/OpenAPI 生成用于 C++:最佳工具和库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swagger/OpenAPI 生成用于 C++:如何自动化创建 REST API



现代 C++ 网络开发需要高效的工具来创建 REST API。OpenAPI 规范(原 Swagger)已成为描述 Web 服务接口的标准。然而,根据 OpenAPI 规范自动生成 C++ 代码是一项具有挑战性的任务。在本文中,我们将分析最佳库和工具,它们将帮助您从 OpenAPI 文档生成服务器端和客户端 C++ 代码。



为什么 C++ 在 OpenAPI 生成方面落后于其他语言?

与 Python、Java 或 JavaScript(这些语言拥有成熟的生成器,例如 openapi-generator)不同,C++ 面临几个问题:

  • 缺乏统一的 HTTP 框架标准 — C++ 中没有像 Flask 或 Spring 那样占主导地位的 Web 框架。
  • 内存管理复杂 — 使用智能指针生成安全代码需要额外的模板。
  • 类型多样性 — C++ 中的 JSON 序列化需要对复杂结构进行手动配置。


从 OpenAPI 生成 C++ 代码的主要工具



1. OpenAPI Generator(官方生成器)

最流行的工具是 OpenAPI Generator(原 Swagger Codegen)。它支持多种语言,包括 C++。然而,它对 C++ 的支持有限:仅基于 cpprestsdk (Casablanca) 或 Qt 生成客户端代码。

安装:

# 通过 npmnpm install @openapitools/openapi-generator-cli -g

# 生成 C++ 客户端 (cpprestsdk)openapi-generator generate -i petstore.yaml -g cpp-restsdk -o ./client

生成的代码示例 (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);};

优点: 支持多种格式,社区活跃。
缺点: 生成的代码通常需要修改;不支持 C++ 服务器端生成。



2. oat++ (oatpp) — 支持 OpenAPI 的框架

oat++ 是一个用于创建 REST API 的现代 C++ 框架,包含对 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 — 一个轻量级的 C++11 HTTP 框架。结合 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 —

推荐