一個輕量級、高性能的 C-- Web 框架

說起 Web 開發,大多數人會想到 Java、Python、Golang ... 因爲它們的主流 Web 框架有很多,Java 有非常知名的 Spring 全家桶,Python 有大而全的 Django、小而精的 Flask、高性能的 Tornado,Golang 也有快速靈活的 Gin、Echo 等框架。

相比之下,C/C++ 陣營則遜色不少。之前,我曾寫過一篇《C++ Web(HTTP)開發 10 大利器》,其中介紹了一些 C/C++ Web 框架。有一個名爲 Oat++ 的很不錯,輕量、跨平臺、高性能、完全零依賴,非常值得學習!

Oat++ 介紹

要深入瞭解 Oat++,離不開這幾個網址:

其主要特性有:

最吸引我的是 HTTP/HTTPS、文件上傳 / 下載、以及強大的  Swagger API 功能。

編譯 Oat++

進入 Oat++ 的 GitHub 頁面,你會發現 Star 多達 4K+,貢獻者有 30 多個,且最近幾天還有代碼提交,所以不用擔心熱度和活躍度,這個框架一直有人在積極地維護。

環境要求

Oat++ 的編譯過程很簡單,只需要有基本的開發環境就行了:

如果沒有的話,按照下述步驟安裝,以 Ubuntu 爲例:

$ sudo apt install git
$ sudo apt install cmake
$ sudo apt install build-essential

編譯安裝

下載 Oat++ 源碼:

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

隨後,執行編譯安裝四部曲:

cd oatpp/
$ mkdir build && cd build
$ cmake ..
$ sudo make && sudo make install

示例程序

爲了演示 Oat++,我們從最簡單的“Hello, World!”開始!

創建一個 CMake 項目,CMakeLists.txt 配置如下:

cmake_minimum_required(VERSION 3.1)
project(helloworld)

set(CMAKE_CXX_STANDARD 11)
set(SOURCE_FILES main.cpp handler.h)

# 查找 oatpp 依賴
find_package(oatpp REQUIRED)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})

# 將目標文件與庫文件進行鏈接
target_link_libraries(${PROJECT_NAME} oatpp::oatpp)

默認情況下,Oat++ 會對客戶端請求響應 404,除此之外什麼都不做。

若要添加自定義響應,必須實現 HttpRequestHandler:

// handler.h
#ifndef HANDLER_H
#define HANDLER_H

#include "oatpp/web/server/HttpRequestHandler.hpp"

#define O_UNUSED(x) (void)x;

// 自定義請求處理程序
class Handler : public oatpp::web::server::HttpRequestHandler
{
public:
    // 處理傳入的請求,並返回響應
    std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {
        O_UNUSED(request);

        return ResponseFactory::createResponse(Status::CODE_200, "Hello, World!");
    }
};

#endif // HANDLER_H

有了處理程序之後,需要通過 Router 將請求路由到它:

// main.cpp
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/network/Server.hpp"
#include "handler.h"

void run()
{
    // 爲 HTTP 請求創建路由器
    auto router = oatpp::web::server::HttpRouter::createShared();

    // 路由 GET - "/hello" 請求到處理程序
    router->route("GET""/hello", std::make_shared<Handler>());

    // 創建 HTTP 連接處理程序
    auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared(router);

    // 創建 TCP 連接提供者
    auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared({"localhost", 8000, oatpp::network::Address::IP_4});

    // 創建服務器,它接受提供的 TCP 連接並將其傳遞給 HTTP 連接處理程序
    oatpp::network::Server server(connectionProvider, connectionHandler);

    // 打印服務器端口
    OATPP_LOGI("MyApp""Server running on port %s", connectionProvider->getProperty("port").getData());

    // 運行服務器
    server.run();
}

int main()
{
    // 初始化 oatpp 環境
    oatpp::base::Environment::init();

    // 運行應用
    run();

    // 銷燬 oatpp 環境
    oatpp::base::Environment::destroy();

    return 0;
}

請求驗證

運行程序,在瀏覽器中訪問 http://localhost:8000/hello,就會顯示 “Hello, World!” 信息了:

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

$ curl http://127.0.0.1:8000/hello
Hello, World!

推薦關注「Linux 愛好者」,提升 Linux 技能

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DcV06ly_6vnrH2bEeqnVJg