Oat++ 是一个开源的 C++ Web 开发框架,接下来通过几篇文章了解下该框架的工作过程以及使用方法。文章主要内容包括:
- Oat++ 安装过程
- Oat++ 基本使用
Document:Oat++ (oatpp.io)
- Oat++ 安装过程 {#title-0} ========================
开发框架给我们提供了丰富的开发底层支持代码,安装的目的即是将这些支持代码库安装到本机,方便我们开发时候调用。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
至此,安装部分结束。
- Oat++ 基本使用 {#title-1} ========================
我们接下来通过 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;
}