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 —