C++ Web Framework Oat++ Hello World

Oat++ 是一个开源的 C++ Web 开发框架,接下来通过几篇文章了解下该框架的工作过程以及使用方法。文章主要内容包括:

  1. Oat++ 安装过程
  2. 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 如下:

  1. 请求 localhost:8000/hello1 显示 Hello Handler1
  2. 请求 localhost:8000/hello2 显示 Hello Handler2

主要类的作用:

  1. HttpRequestHandler 定义请求 URL 的处理函数;
  2. HttpRouter 用于 URL 和 HttpRequestHandler 的关联;
  3. HttpConnectionHandler 服务器连接处理
  4. ConnectionProvider 服务器监听参数
  5. 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;
}

未经允许不得转载:一亩三分地 » C++ Web Framework Oat++ Hello World
评论 (0)

1 + 6 =