Oat++ 是一个开源的 C++ Web 开发框架,接下来通过几篇文章了解下该框架的工作过程以及使用方法。文章主要内容包括:
- Oat++ 安装过程
- Oat++ 基本使用
Document:Oat++ (oatpp.io)
1. Oat++ 安装过程
开发框架给我们提供了丰富的开发底层支持代码,安装的目的即是将这些支持代码库安装到本机,方便我们开发时候调用。Oat++ 的安装较为简单,官方给出的安装链接:Installation on Unix/Linux | Oat++ (oatpp.io)。
安装时候先根据平台安装好 git、以及C++的编译套件,不同的系统安装方法大同小异,如下:
Ubuntu:
$ apt-get install git $ apt-get install cmake $ apt-get install build-essential
Centos、Fedora:
$ yum install git $ yum install cmake $ yum install gcc gcc-c++ make $ yum install libatomic
Alpine:
$ apk add git $ apk add cmake $ apk add g++ $ apk add make
安装好必要的软件软件,接下来通过下面的过程安装 Oat++,如下命令:
$ git clone https://github.com/oatpp/oatpp.git $ cd oatpp/ $ mkdir build && cd build $ cmake .. $ make install
至此,安装部分结束。
2. Oat++ 基本使用
我们接下来通过 Oat++ 实现请求不同的 URL 服务,在浏览器显示不同的内容。我们设计请求 URL 如下:
- 请求 localhost:8000/hello1 显示 Hello Handler1
- 请求 localhost:8000/hello2 显示 Hello Handler2
主要类的作用:
- HttpRequestHandler 定义请求 URL 的处理函数;
- HttpRouter 用于 URL 和 HttpRequestHandler 的关联;
- HttpConnectionHandler 服务器连接处理
- ConnectionProvider 服务器监听参数
- Server 服务监听
CMakeLists.txt
include_directories(/usr/local/include/oatpp-1.3.0/oatpp) cmake_minimum_required(VERSION 3.18) project(oatpp_hello_world) set(CMAKE_CXX_STANDARD 11) add_executable(oatpp_hello_world main.cpp) target_link_libraries(oatpp_hello_world /usr/local/lib/oatpp-1.3.0/liboatpp.a)
具体代码含义在示例中给出了注释,示例代码:
#include "oatpp/web/server/HttpConnectionHandler.hpp" #include "oatpp/network/Server.hpp" #include "oatpp/network/tcp/server/ConnectionProvider.hpp" #include "oatpp/web/server/HttpRouter.hpp" #include "oatpp/web/server/HttpRequestHandler.hpp" // 请求 URL 对应的处理类为 HttpRequestHandler 的子类 // 在子类中需要实现负类的 virtual 函数 handle,该函数为实际调用的处理函数 class Handler1 : public oatpp::web::server::HttpRequestHandler { public: std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override { (void)request; // createResponse 函数用于构建响应报文 // oatpp::web::server::HttpRequestHandler::ResponseFactory // oatpp::web::server::HttpRequestHandler::Status // createResponse 存在 3 个重载方法,如下: // 下面两种方法返回的是 text 格式内容 // static std::shared_ptr<Response> createResponse(const Status &status); // static std::shared_ptr<Response> createResponse(const Status& status, const oatpp::String& text); // 下面重载的方法可以通过传递第三个参数使得返回 json 格式内容 // static std::shared_ptr<Response> createResponse(const Status& status, const oatpp::Void& dto, const std::shared_ptr<data::mapping::ObjectMapper>& objectMapper); return ResponseFactory::createResponse(Status::CODE_200, "Hello Handler1"); } }; class Handler2 : public oatpp::web::server::HttpRequestHandler { public: std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override { (void)request; return ResponseFactory::createResponse(Status::CODE_200, "Hello Handler2"); } }; void run() { // 1. 创建路由对象 auto router = oatpp::web::server::HttpRouter::createShared(); // 共享指针能够使得动态对象具备拷贝和移动语义,并且能够自动管理内存,避免内存泄漏 // 第一个参数为请求方法、第二个参数请求 URL、第三个参数为请求处理对象 router->route("GET", "/hello1", std::make_shared<Handler1>()); router->route("GET", "/hello2", std::make_shared<Handler2>()); // 2. 连接处理对象 // 服务器接受得到连接之后,交给 HttpConnectionHandler 来处理连接 auto conn_handler = oatpp::web::server::HttpConnectionHandler::createShared(router); // 3. 套接字监听参数 auto address = oatpp::network::Address({"localhost", 8000, oatpp::network::Address::IP_4}); auto conn_provider = oatpp::network::tcp::server::ConnectionProvider::createShared(address); // 4. 构建服务对象 oatpp::network::Server server(conn_provider, conn_handler); // 5. 服务启动信息 OATPP_LOGI("Oat++ Demo", " 服务器在端口 %s 监听...", conn_provider->getProperty("port").getData()); // 6. 启动服务等待连接 server.run(); } int main() { oatpp::base::Environment::init(); run(); oatpp::base::Environment::destroy(); return 0; }