目录
[3.3.API 控制器](#3.3.API 控制器)
4.5.src/controller/UserController.hpp
[4.6.src/App.cpp 主入口](#4.6.src/App.cpp 主入口)
1.简介
Oat++(Oatpp)是一个现代、轻量级、高性能、零依赖的 C++ Web 框架,专为构建可扩展的 Web 服务、RESTful API 和高并发应用而设计。它以纯 C++ 实现,无需外部依赖,可轻松移植到各种平台,从嵌入式设备到云服务器,特别适合 IoT、机器人和微服务开发场景
核心特点有:
| 特性 | 说明 |
|---|---|
| 零依赖 | 纯 C++ 实现,无需第三方库,编译简单,移植性极强 |
| 双 API 模式 | Simple-API (同步,基于线程池) 适合 CPU 密集型任务;Async-API (异步,基于协程) 可处理500 万 + 并发连接 |
| 高性能 | 异步 I/O 模型,内存池优化,低延迟高吞吐量,单位 CPU 周期处理请求数最多 |
| REST 框架 | 强大的路由系统,支持路径参数、查询参数、请求体映射,自动文档生成 |
| 对象映射 | 内置 JSON 序列化 / 反序列化,支持 DTO (数据传输对象),确保 API 一致性 |
| ORM 支持 | 内置轻量级 ORM,简化数据库操作 |
| WebSocket | 原生支持 WebSocket,适合实时通信应用 |
| Swagger 集成 | 自动生成 OpenAPI 3.0 文档,通过 Swagger-UI 可视化 API |
| 依赖注入 | 内置 DI 框架,简化组件管理和测试 |
| 跨平台 | 支持 Linux、macOS、Windows 等,可移植到任何有线程和网络栈的环境 |
2.安装与配置
https://github.com/oatpp/oatpp
https://gitee.com/mirrors/oatpp
1.获取源码
cpp
git clone https://github.com/oatpp/oatpp.git
cd oatpp && mkdir build && cd build
cmake .. -DOATPP_BUILD_EXAMPLES=OFF -DOATPP_BUILD_TESTS=OFF
make -j4
sudo make install
CMake 高级配置选项(可选)
| 选项 | 说明 | 默认值 |
|---|---|---|
-DCMAKE_INSTALL_PREFIX |
安装路径 | /usr/local |
-DOATPP_BUILD_EXAMPLES |
编译示例 | ON |
-DOATPP_BUILD_TESTS |
编译测试 | ON |
-DOATPP_DISABLE_ENV_OBJECT_COUNTER |
禁用对象计数 | OFF |
-DOATPP_COMPAT_BUILD_NO_THREAD_LOCAL |
兼容无 thread_local 环境 | OFF |
2.CMake 集成示例
cpp
cmake_minimum_required(VERSION 3.10)
project(MyOatppProject)
set(CMAKE_CXX_STANDARD 17)
find_package(oatpp REQUIRED)
add_executable(myapp main.cpp)
target_link_libraries(myapp oatpp::oatpp)
3.Oat++ 扩展模块安装(如 Swagger)
Oat++ 提供多个扩展模块,常用的有:
cpp
# 安装oatpp-swagger(API文档生成)
git clone https://github.com/oatpp/oatpp-swagger.git
cd oatpp-swagger && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install
# 其他常用扩展
git clone https://github.com/oatpp/oatpp-orm.git # ORM数据库模块
git clone https://github.com/oatpp/oatpp-websocket.git # WebSocket模块
git clone https://github.com/oatpp/oatpp-curl.git # HTTP客户端模块
3.快速入门
3.1.同步版本 (Simple-API)
cpp
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/network/Server.hpp"
#include "oatpp/web/server/HttpRouter.hpp"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"
class HelloHandler : public oatpp::web::server::HttpRequestHandler {
public:
std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {
auto dto = oatpp::parser::json::mapping::ObjectMapper::createShared()->writeToString(
oatpp::Fields<oatpp::String>::createShared({{"message", "Hello, Oat++!"}})
);
return createResponse(Status::CODE_200, dto, "application/json");
}
};
void run() {
auto router = oatpp::web::server::HttpRouter::createShared();
router->route("GET", "/hello", std::make_shared<HelloHandler>());
auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared(
{"0.0.0.0", 8000, oatpp::network::Address::IP_4}
);
auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);
oatpp::network::Server server(connectionProvider, connectionHandler);
OATPP_LOGI("Server", "Running on port 8000");
server.run();
}
int main() {
oatpp::base::Environment::init();
run();
oatpp::base::Environment::destroy();
return 0;
}
3.2.异步版本 (Async-API)
cpp
#include "oatpp/web/server/AsyncHttpConnectionHandler.hpp"
#include "oatpp/async/Coroutine.hpp"
class HelloAsyncHandler : public oatpp::web::server::HttpRequestHandler {
public:
class Coroutine : public oatpp::async::Coroutine<Coroutine> {
private:
std::shared_ptr<IncomingRequest> m_request;
public:
Coroutine(const std::shared_ptr<IncomingRequest>& request) : m_request(request) {}
Action act() override {
auto dto = oatpp::Fields<oatpp::String>::createShared({{"message", "Hello, Async Oat++!"}});
auto response = createDtoResponse(Status::CODE_200, dto);
return _return(response);
}
};
std::shared_ptr<AsyncAction> actAsync(const std::shared_ptr<IncomingRequest>& request) override {
return Coroutine::start(request);
}
};
void runAsyncServer() {
auto router = oatpp::web::server::HttpRouter::createShared();
router->route("GET", "/async/hello", std::make_shared<HelloAsyncHandler>());
auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared(
{"0.0.0.0", 8000, oatpp::network::Address::IP_4}
);
auto connectionHandler = oatpp::web::server::AsyncHttpConnectionHandler::createShared(router);
oatpp::network::Server server(connectionProvider, connectionHandler);
OATPP_LOGI("AsyncServer", "Running on port 8000");
server.run();
}
3.3.API 控制器
使用ENDPOINT宏简化路由定义,支持自动参数绑定:
cpp
class UserController : public oatpp::web::server::api::ApiController {
public:
UserController(OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper))
: oatpp::web::server::api::ApiController(objectMapper) {}
ENDPOINT_INFO(getUser) {
info->summary = "Get user by ID";
info->pathParams["userId"].description = "User ID";
info->responses[200].description = "User DTO";
}
ENDPOINT("GET", "/users/{userId}", getUser,
PATH(Int64, userId))
{
auto user = m_userService->getUserById(userId);
return createDtoResponse(Status::CODE_200, user);
}
ENDPOINT("POST", "/users", createUser,
BODY_DTO(Object<UserDto>, userDto))
{
auto createdUser = m_userService->createUser(userDto);
return createDtoResponse(Status::CODE_201, createdUser);
}
static std::shared_ptr<UserController> createShared(
OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper)
) {
return std::make_shared<UserController>(objectMapper);
}
};
3.4.DTO (数据传输对象)
定义强类型数据结构,自动 JSON 序列化:
cpp
#include "oatpp/core/Types.hpp"
class UserDto : public oatpp::DTO {
DTO_INIT(UserDto, DTO)
DTO_FIELD(Int64, id);
DTO_FIELD(String, name, "username"); // JSON字段映射
DTO_FIELD(String, email, "email");
DTO_FIELD(Boolean, active, "is_active");
};
3.5.依赖注入 (DI)
通过组件配置实现松耦合:
cpp
class AppComponent {
public:
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper)
([] {
auto objectMapper = oatpp::parser::json::mapping::ObjectMapper::createShared();
// 配置序列化选项
return objectMapper;
}());
OATPP_CREATE_COMPONENT(std::shared_ptr<UserService>, userService)
([] {
return std::make_shared<UserService>();
}());
};
4.完整开发web服务示例
RESTful API + DTO 自动序列化 + Swagger 接口文档 + 依赖注入 + 标准项目结构
全程使用同步 Simple API,代码极简、可直接复制使用。
4.1.完整项目结构
cpp
oatpp-demo/
├── CMakeLists.txt
├── src/
│ ├── AppComponent.hpp // 依赖注入&全局组件
│ ├── dto/
│ │ └── UserDto.hpp // 数据传输对象
│ ├── controller/
│ │ └── UserController.hpp // API控制器
│ └── App.cpp // 主入口
4.2.CMakeLists.txt
cpp
cmake_minimum_required(VERSION 3.12)
project(oatpp-demo)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 oatpp 核心与 swagger
find_package(oatpp REQUIRED)
find_package(oatpp-swagger REQUIRED)
add_executable(oatpp-app
src/App.cpp
)
# 链接库
target_link_libraries(oatpp-app
oatpp::oatpp
oatpp::oatpp-swagger
)
# 头文件路径
target_include_directories(oatpp-app PUBLIC src)
4.3.src/dto/UserDto.hpp
DTO 自动 JSON 序列化 / 反序列化
cpp
#ifndef UserDto_hpp
#define UserDto_hpp
#include "oatpp/core/Types.hpp"
#include "oatpp/core/macro/codegen.hpp"
#include OATPP_CODEGEN_BEGIN(DTO)
class UserDto : public oatpp::DTO {
DTO_INIT(UserDto, DTO)
DTO_FIELD(Int64, id);
DTO_FIELD(String, username, "username");
DTO_FIELD(String, email, "email");
DTO_FIELD(Int32, age, "age");
DTO_FIELD(Boolean, active, "active") = true;
};
#include OATPP_CODEGEN_END(DTO)
#endif /* UserDto_hpp */
4.4.src/AppComponent.hpp
全局组件:对象映射器、Swagger、HTTP 路由、连接池
cpp
#ifndef AppComponent_hpp
#define AppComponent_hpp
#include "oatpp/web/server/HttpRouter.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"
#include "oatpp/core/macro/component.hpp"
// Swagger
#include "oatpp-swagger/Model.hpp"
#include "oatpp-swagger/Resources.hpp"
class AppComponent {
public:
/**
* 注入 JSON 序列化器
*/
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper)
([] {
return oatpp::parser::json::mapping::ObjectMapper::createShared();
}());
/**
* 注入 HTTP 路由器
*/
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, httpRouter)
([] {
return oatpp::web::server::HttpRouter::createShared();
}());
/**
* 注入 TCP 连接提供者
*/
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)
([] {
return oatpp::network::tcp::server::ConnectionProvider::createShared({"0.0.0.0", 8000});
}());
/**
* Swagger 文档信息
*/
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::swagger::DocumentInfo>, swaggerDocumentInfo)
([] {
return oatpp::swagger::DocumentInfo::Builder()
.setTitle("Oat++ 用户管理 API")
.setDescription("完整 Web 服务示例")
.setVersion("1.0.0")
.build();
}());
/**
* Swagger 静态资源
*/
OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::swagger::Resources>, swaggerResources)
([] {
return oatpp::swagger::Resources::loadResources(OATPP_SWAGGER_RES_PATH);
}());
};
#endif /* AppComponent_hpp */
4.5.src/controller/UserController.hpp
RESTful 接口:查单个、查列表、新增、修改、删除
cpp
#ifndef UserController_hpp
#define UserController_hpp
#include "dto/UserDto.hpp"
#include "oatpp/web/server/api/ApiController.hpp"
#include "oatpp/core/macro/codegen.hpp"
#include "oatpp/core/macro/component.hpp"
#include OATPP_CODEGEN_BEGIN(ApiController)
class UserController : public oatpp::web::server::api::ApiController {
private:
// 模拟数据库
std::unordered_map<oatpp::Int64, oatpp::Object<UserDto>> m_db;
std::atomic<oatpp::Int64> m_idCounter{1};
public:
UserController(const std::shared_ptr<ObjectMapper>& objectMapper)
: oatpp::web::server::api::ApiController(objectMapper)
{}
public:
static std::shared_ptr<UserController> createShared(
OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper)
){
return std::make_shared<UserController>(objectMapper);
}
/**
* 查单个用户
*/
ENDPOINT("GET", "/users/{userId}", getUserById,
PATH(Int64, userId))
{
auto it = m_db.find(userId);
if(it == m_db.end()){
return createResponse(Status::CODE_404, "user not found");
}
return createDtoResponse(Status::CODE_200, it->second);
}
/**
* 查所有用户
*/
ENDPOINT("GET", "/users", listUsers) {
auto list = oatpp::List<oatpp::Object<UserDto>>::createShared();
for(auto& pair : m_db) {
list->push_back(pair.second);
}
return createDtoResponse(Status::CODE_200, list);
}
/**
* 新增用户
*/
ENDPOINT("POST", "/users", createUser,
BODY_DTO(Object<UserDto>, userDto))
{
userDto->id = m_idCounter++;
m_db[userDto->id] = userDto;
return createDtoResponse(Status::CODE_201, userDto);
}
/**
* 修改用户
*/
ENDPOINT("PUT", "/users/{userId}", updateUser,
PATH(Int64, userId),
BODY_DTO(Object<UserDto>, userDto))
{
auto it = m_db.find(userId);
if(it == m_db.end()){
return createResponse(Status::CODE_404, "user not found");
}
userDto->id = userId;
m_db[userId] = userDto;
return createDtoResponse(Status::CODE_200, userDto);
}
/**
* 删除用户
*/
ENDPOINT("DELETE", "/users/{userId}", deleteUser,
PATH(Int64, userId))
{
m_db.erase(userId);
return createResponse(Status::CODE_200, "user deleted");
}
};
#include OATPP_CODEGEN_END(ApiController)
#endif /* UserController_hpp */
4.6.src/App.cpp 主入口
cpp
#include "AppComponent.hpp"
#include "controller/UserController.hpp"
#include "oatpp-swagger/Controller.hpp"
#include "oatpp/network/Server.hpp"
#include <iostream>
void run() {
// 初始化组件
AppComponent components;
// 获取路由
OATPP_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, router);
// 注册控制器
router->addController(UserController::createShared());
// 注册 Swagger
router->addController(oatpp::swagger::Controller::createShared());
// 获取连接处理器 & 服务
OATPP_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, connectionProvider);
auto handler = oatpp::web::server::HttpConnectionHandler::createShared(router);
oatpp::network::Server server(connectionProvider, handler);
// 启动
OATPP_LOGI("Server", "running on http://0.0.0.0:8000");
OATPP_LOGI("Swagger", "http://0.0.0.0:8000/swagger/ui");
server.run();
}
int main() {
oatpp::base::Environment::init();
run();
oatpp::base::Environment::destroy();
return 0;
}
4.7.编译并启动服务
cpp
//[1]
mkdir build && cd build
cmake ..
make -j8
//[2]
./oatpp-app
总结:
- 完整 RESTful CRUD
- DTO 自动 JSON 序列化
- 路径参数 / 表单 / JSON Body 自动绑定
- Swagger 自动接口文档
- 依赖注入(OATPP_COMPONENT)
- 内存模拟数据库
- 标准 Oat++ 项目结构
5.性能与对比
1.性能指标
- 并发连接:Async-API 模式下单服务器可处理 500 万 + WebSocket 连接
- 内存占用:启动内存约 5-8MB,高并发下内存增长稳定 (内存池优化)
- 吞吐量:在测试中展现出比 Crow、Pistache 更高的吞吐量
- 二进制大小 :嵌入式场景下最小应用体积仅1MB 左右
2.主流 C++ Web 框架对比
| 框架 | 依赖 | 并发模型 | 性能 | 适合场景 |
|---|---|---|---|---|
| Oat++ | 零依赖 | 同步 + 异步 (协程) | ★★★★★ | IoT、嵌入式、高并发微服务 |
| Drogon | Boost | 异步 (I/O 复用) | ★★★★☆ | 高性能 Web 服务 |
| Crow | Boost | 同步 (部分异步支持) | ★★★☆☆ | 快速开发,轻量级应用 |
| Pistache | 无 (但依赖 C++17) | 异步 | ★★★★☆ | 现代 C++ 风格应用 |
| Poco | 自身库 | 同步 | ★★★☆☆ | 企业级应用,功能全面 |
Drogon: 一个开源的C++高性能Web框架
Poco: 一个功能丰富、易于使用的跨平台C++开发框架(FTP上传下载、断点续传、HTTP的GET请求等)
6.适用场景
- 嵌入式 Web 服务:零依赖特性使其成为嵌入式设备 (如树莓派) Web 界面的理想选择
- IoT 与机器人:Oat++ 在 IoT 和机器人领域应用最为广泛,适合构建设备管理 API
- 微服务架构:轻量级、高性能、低资源消耗,适合容器化部署
- 实时通信:WebSocket 支持适合聊天应用、实时监控系统
- 高性能 API:金融、游戏等对延迟敏感的应用
- 跨平台应用:一次编写,多平台部署,减少移植成本
7.总结
Oat++ 以其零依赖、高性能、双 API 模式和丰富的功能集,成为 C++ Web 开发的优秀选择,特别适合对依赖控制严格、追求高性能和可移植性的项目。无论是构建嵌入式设备的轻量级 API,还是开发处理海量并发的云服务,Oat++ 都能提供简洁、高效的解决方案。