Oatpp 入门--最简框架

auther: abinng date: 2026-03-15 10:25 createDate:2026-03-15 10:23

Code display

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "oatpp/web/server/HttpConnectionHandler.hpp"

#include "oatpp/network/Server.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"

/**
* Custom Request Handler
*/
class Handler : public oatpp::web::server::HttpRequestHandler {
public:

/**
* Handle incoming request and return outgoing response.
*/
std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {
return ResponseFactory::createResponse(Status::CODE_200, "Hello World!");
}

};

void run() {

/* Create Router for HTTP requests routing */
auto router = oatpp::web::server::HttpRouter::createShared();

/* Route GET - "/hello" requests to Handler */
router->route("GET", "/hello", std::make_shared<Handler>());

/* Create HTTP connection handler with router */
auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);

/* Create TCP connection provider */
auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost", 8000, oatpp::network::Address::IP_4});

/* Create server which takes provided TCP connections and passes them to HTTP connection handler */
oatpp::network::Server server(connectionProvider, connectionHandler);

/* Priny info about server port */
OATPP_LOGI("MyApp", "Server running on port %s", connectionProvider->getProperty("port").getData());

/* Run server */
server.run();
}

int main() {

/* Init oatpp Environment */
oatpp::base::Environment::init();

/* Run App */
run();

/* Destroy oatpp Environment */
oatpp::base::Environment::destroy();

return 0;

}

解析

这段代码展示了 Oat++(一个高性能、现代 C++ Web 框架)最核心的工作流。我们可以将这个过程拆解为初始化架构组件以及请求处理生命周期三个部分来理解。

1. 核心组件拆解

run() 函数中,构建了服务器的四个关键层级:

  • Router (路由): 就像地图。它记录了哪个 URL 路径(如 /hello)对应哪个业务逻辑(Handler)。
  • ConnectionHandler (协议处理器): 它是“翻译官”。负责将底层的 TCP 字节流解析成 HTTP 请求对象,并将 HTTP 响应转换回字节流。
  • ConnectionProvider (连接提供者): 它是“门卫”。负责底层的网络通信(监听端口、接受 Socket 连接)。这里使用了 TCP IPv4 协议,监听 8000 端口。
  • Server (服务器主引擎): 它是“调度员”。它把“门卫”拿到的连接交给“翻译官”去处理。

2. 请求处理流程 (Request Lifecycle)

当你在浏览器访问 http://localhost:8000/hello 时,数据流转如下:

  1. 建立连接: ConnectionProvider 监听到新的 TCP 请求,创建一个 Socket。
  2. 移交任务: Server 接收到这个连接,并将其传递给 ConnectionHandler
  3. 解析协议: ConnectionHandler 从 Socket 读取数据,解析 HTTP 头部和正文,构造出一个 IncomingRequest 对象。
  4. 路由匹配: ConnectionHandler 询问 Router:“这个 GET 请求访问 /hello,我该找谁?” Router 返回指向 Handler 的指针。
  5. 执行逻辑: 调用 Handler::handle() 方法。
    • 简单地通过 ResponseFactory 创建了一个包含 “Hello World!” 的 200 OK 响应。
  6. 返回响应: ConnectionHandler 将返回的 OutgoingResponse 序列化为字符串,通过 TCP 发回给客户端,然后根据配置决定是否关闭连接。

3. 代码细节说明

  • 环境管理: oatpp::base::Environment::init()destroy() 是必须的。Oat++ 有一套自己的内存管理机制(如组件注入和智能指针),这两行代码负责启动和清理整个框架的内存池和日志系统。
  • 多线程模型: 虽然这段代码看起来很简洁,但 oatpp::network::Server 在调用 run() 后,默认会在内部通过阻塞或非阻塞(取决于配置)的方式循环等待连接。每当有新请求时,它会高效地分配任务。
  • 智能指针: 你会发现代码中大量使用了 std::shared_ptrcreateShared()。这是 Oat++ 的设计风格,确保了在异步或多线程环境下,对象(如 Router 和 Handler)的生命周期能被正确管理,避免内存泄漏。