一个轻量级、高性能的 C++ Web 框架

开发 前端
说起 Web 开发,大多数人会想到 Java、Python、Golang ... 因为它们的主流 Web 框架有很多,Java 有非常知名的 Spring 全家桶,Python 有大而全的 Django、小而精的 Flask、高性能的 Tornado,Golang 也有快速灵活的 Gin、Echo 等框架。

说起 Web 开发,大多数人会想到 Java、Python、Golang ... 因为它们的主流 Web 框架有很多,Java 有非常知名的 Spring 全家桶,Python 有大而全的 Django、小而精的 Flask、高性能的 Tornado,Golang 也有快速灵活的 Gin、Echo 等框架。

相比之下,C/C++ 阵营则逊色不少。之前,我曾写过一篇《C++ Web(HTTP)开发 10 大利器》,其中介绍了一些 C/C++ Web 框架。有一个名为 Oat++ 的很不错,轻量、跨平台、高性能、完全零依赖,非常值得学习!

1

Oat++ 介绍

要深入了解 Oat++,离不开这几个网址:

  • Oat++ 主页:https://oatpp.io
  • Oat++ 文档:https://oatpp.io/docs/start
  • GitHub 地址:https://github.com/oatpp/oatpp

其主要特性有:

  • 随处运行
  • Oat++ 没有任何依赖性,可以很容易地移植到各种支持的平台上(Linux、MacOS、Windows)。
  • 构建健壮的api
  • 使用 Oat++ Simple-API,构建灵活而健壮的 API 既简单又有趣。
  • 处理 500 万个连接
  • 使用 Oat++ Async-API,可以在单个服务器上处理超过 500 万个并发连接。
  • 访问数据库
  • Oat++ ORM 提供了一种简单而统一的方式来访问数据库
  • 保持代码一致
  • Oat++ 在整个代码库中依靠对象映射来确保 API 和数据模型的一致性
  • 生成 API 文档
  • 使用 Swagger-UI 和 OpenAPI 3.0.0 自动记录 endpoints

最吸引我的是 HTTP/HTTPS、文件上传/下载、以及强大的 Swagger API 功能。

 

2

编译 Oat++

进入 Oat++ 的 GitHub 页面,你会发现 Star 多达 4K+,贡献者有 30 多个,且最近几天还有代码提交,所以不用担心热度和活跃度,这个框架一直有人在积极地维护。

环境要求

Oat++ 的编译过程很简单,只需要有基本的开发环境就行了:

  • Git
  • 编译器支持的 C++ 版本 >= 11
  • Make
  • CMake 版本 >= 3.1

如果没有的话,按照下述步骤安装,以 Ubuntu 为例:

  1. $ sudo apt install git 
  2.  
  3. $ sudo apt install cmake 
  4.  
  5. $ sudo apt install build-essential 

编译安装

下载 Oat++ 源码:

  1. $ git clone https://github.com/oatpp/oatpp.git 

随后,执行编译安装四部曲:

  1. $ cd oatpp/ 
  2.  
  3. $ mkdir build && cd build 
  4.  
  5. $ cmake .. 
  6.  
  7. $ sudo make && sudo make install 

3

示例程序

 

为了演示 Oat++,我们从最简单的“Hello, World!”开始!

创建一个 CMake 项目,CMakeLists.txt 配置如下:

  1. cmake_minimum_required(VERSION 3.1
  2.  
  3. project(helloworld) 
  4.  
  5. set(CMAKE_CXX_STANDARD 11
  6.  
  7. set(SOURCE_FILES main.cpp handler.h) 
  8.  
  9. # 查找 oatpp 依赖 
  10.  
  11. find_package(oatpp REQUIRED) 
  12.  
  13. add_executable(${PROJECT_NAME} ${SOURCE_FILES}) 
  14.  
  15. # 将目标文件与库文件进行链接 
  16.  
  17. target_link_libraries(${PROJECT_NAME} oatpp::oatpp) 

默认情况下,Oat++ 会对客户端请求响应 404,除此之外什么都不做。

若要添加自定义响应,必须实现 HttpRequestHandler:

  1. // handler.h 
  2.  
  3. #ifndef HANDLER_H 
  4.  
  5. #define HANDLER_H 
  6.  
  7. #include "oatpp/web/server/HttpRequestHandler.hpp" 
  8.  
  9. #define O_UNUSED(x) (void)x; 
  10.  
  11. // 自定义请求处理程序 
  12.  
  13. class Handler : public oatpp::web::server::HttpRequestHandler 
  14.  
  15.  
  16. public
  17.  
  18. // 处理传入的请求,并返回响应 
  19.  
  20. std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override { 
  21.  
  22. O_UNUSED(request); 
  23.  
  24. return ResponseFactory::createResponse(Status::CODE_200, "Hello, World!"); 
  25.  
  26.  
  27. }; 
  28.  
  29. #endif // HANDLER_H 

有了处理程序之后,需要通过 Router 将请求路由到它:

  1. // main.cpp 
  2.  
  3. #include "oatpp/web/server/HttpConnectionHandler.hpp" 
  4.  
  5. #include "oatpp/network/tcp/server/ConnectionProvider.hpp" 
  6.  
  7. #include "oatpp/network/Server.hpp" 
  8.  
  9. #include "handler.h" 
  10.  
  11. void run() 
  12.  
  13.  
  14. // 为 HTTP 请求创建路由器 
  15.  
  16. auto router = oatpp::web::server::HttpRouter::createShared(); 
  17.  
  18. // 路由 GET - "/hello" 请求到处理程序 
  19.  
  20. router->route("GET""/hello", std::make_shared<Handler>()); 
  21.  
  22. // 创建 HTTP 连接处理程序 
  23.  
  24. auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router); 
  25.  
  26. // 创建 TCP 连接提供者 
  27.  
  28. auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost"8000, oatpp::network::Address::IP_4}); 
  29.  
  30. // 创建服务器,它接受提供的 TCP 连接并将其传递给 HTTP 连接处理程序 
  31.  
  32. oatpp::network::Server server(connectionProvider, connectionHandler); 
  33.  
  34. // 打印服务器端口 
  35.  
  36. OATPP_LOGI("MyApp""Server running on port %s", connectionProvider->getProperty("port").getData()); 
  37.  
  38. // 运行服务器 
  39.  
  40. server.run(); 
  41.  
  42.  
  43. int main() 
  44.  
  45.  
  46. // 初始化 oatpp 环境 
  47.  
  48. oatpp::base::Environment::init(); 
  49.  
  50. // 运行应用 
  51.  
  52. run(); 
  53.  
  54. // 销毁 oatpp 环境 
  55.  
  56. oatpp::base::Environment::destroy(); 
  57.  
  58. return 0
  59.  

 

4

请求验证

 

运行程序,在浏览器中访问 http://localhost:8000/hello,就会显示“Hello, World!”信息了:

或者使用 curl 请求 http://127.0.0.1:8000/hello,效果一样:

  1. $ curl http://127.0.0.1:8000/hello 
  2.  
  3. Hello, World! 

 

 

责任编辑:张燕妮 来源: 高效程序员
相关推荐

2017-10-11 16:12:19

内存

2020-10-13 18:09:22

开发框架开源

2023-06-28 08:16:50

Autofac应用程序

2022-08-10 12:21:07

PythonWebBottle

2019-12-13 19:00:26

PekwmLinux桌面

2020-09-04 09:27:40

开源C++搜狗

2020-08-27 11:39:05

JavaRESTful Web编程语言

2023-06-13 13:38:00

FlaskPython

2023-12-12 13:50:00

代码业务状态

2022-06-06 22:23:26

Tina工具Markdown

2024-01-03 07:42:49

分割模型高性能

2023-06-27 16:42:18

Tinygrad深度学习工具

2021-01-05 08:35:24

GNU nanoVim编辑器

2024-06-07 10:34:28

Rust开发工具

2011-08-25 15:35:18

Lua游戏对象

2021-06-24 10:27:48

分布式架构系统

2018-01-17 15:05:22

框架设计爬虫Scrapy

2021-06-25 10:45:43

Netty 分布式框架 IO 框架

2017-11-09 17:17:36

KotlinJavaWeb

2020-11-11 12:13:59

JS
点赞
收藏

51CTO技术栈公众号