Skip to content

Oatpp Backend Framework

  • 用C++写RESTful API,目前在Github上面有一个比较具有关注度的C++后端框架,Oatpp,
  • 官方网站在这里

前置环境安装

安装Oatpp环境

Optional 1: 自编译oatpp

shell
git clone https://github.com/oatpp/oatpp.git
cd oatpp/
mkdir build && cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../vcpkg/scripts/buildsystems/vcpkg.cmake
sudo make && sudo make install

Optional 2: 使用VCPG形式安装oatpp

shell
# 安装vcpkg依赖
git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg install oatpp

创建项目

shell
# 创建Oatpp项目
mkdir my_oatapp_api

构建如下目录

css
my_oatpp_api/
├── CMakeLists.txt
├── src/
│   ├── AppComponent.hpp
│   ├── Controller.hpp
│   ├── main.cpp
│   └── dto/
│       ├── MessageDto.hpp

Resource

  • App.cpp
c++
#include "AppComponent.hpp"
#include "Controller.hpp"
#include "oatpp/core/macro/component.hpp"
#include "oatpp/network/Server.hpp"

int main() {
    oatpp::base::Environment::init();

    AppComponent components;

    OATPP_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, connectionProvider);
    OATPP_COMPONENT(std::shared_ptr<oatpp::network::ConnectionHandler>, connectionHandler);
    OATPP_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, router);
    OATPP_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, objectMapper);

    auto helloController = std::make_shared<HelloController>(objectMapper);

    router->addController(helloController);

    oatpp::network::Server server(connectionProvider, connectionHandler);

    OATPP_LOGI("Oatpp", "Server running on port 8000...");
    server.run();

    oatpp::base::Environment::destroy();
    return 0;
}
  • AppComponent.hpp
cpp
#pragma once
#include "oatpp/network/tcp/server/ConnectionProvider.hpp"
#include "oatpp/web/server/HttpConnectionHandler.hpp"
#include "oatpp/web/server/HttpRouter.hpp"
#include "oatpp/core/macro/component.hpp"
#include "oatpp/core/data/mapping/ObjectMapper.hpp"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"

class AppComponent {
public:

  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ServerConnectionProvider>, serverConnectionProvider)([] {
      oatpp::network::Address address("0.0.0.0", 8000, oatpp::network::Address::IP_4);
      return oatpp::network::tcp::server::ConnectionProvider::createShared(address);
  }());

  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, httpRouter)([] {
      return oatpp::web::server::HttpRouter::createShared();
  }());

  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::network::ConnectionHandler>, serverConnectionHandler)([] {
      OATPP_COMPONENT(std::shared_ptr<oatpp::web::server::HttpRouter>, router);
      return oatpp::web::server::HttpConnectionHandler::createShared(router);
  }());

  OATPP_CREATE_COMPONENT(std::shared_ptr<oatpp::data::mapping::ObjectMapper>, apiObjectMapper)([] {
      return oatpp::parser::json::mapping::ObjectMapper::createShared();
  }());
};

Controller.hpp

cpp
#pragma once
#include "oatpp/web/server/api/ApiController.hpp"
#include "oatpp/core/macro/codegen.hpp"

#include "oatpp/core/macro/codegen.hpp"
#include "dto/MessageDto.hpp"

#include OATPP_CODEGEN_BEGIN(ApiController)

class HelloController : public oatpp::web::server::api::ApiController {
public:
    HelloController(const std::shared_ptr<oatpp::data::mapping::ObjectMapper>& objectMapper)
        : oatpp::web::server::api::ApiController(objectMapper) {}

    ENDPOINT("GET", "/hello", hello) {
        return createResponse(Status::CODE_200, "Hello, Oat++!");
    }

    ENDPOINT("GET", "/echo/{msg}", echo, PATH(String, msg)) {
        return createResponse(Status::CODE_200, "You said: " + msg);
    }

    ENDPOINT("GET", "/json", getJson) {
        auto dto = MessageDto::createShared();
        dto->message = "Hello, Oat++ JSON!";

        // createDtoResponse 会把 DTO 自动序列化成 JSON
        return createDtoResponse(Status::CODE_200, dto);
    }
};

#include OATPP_CODEGEN_END(ApiController)
  • MessageDto.hpp
cpp
#include "oatpp/core/macro/codegen.hpp"
#include "oatpp/core/macro/codegen.hpp"

#include OATPP_CODEGEN_BEGIN(DTO)

class MessageDto : public oatpp::DTO {
    DTO_INIT(MessageDto, DTO)

    DTO_FIELD(String, message);
};

#include OATPP_CODEGEN_END(DTO)

CMAKE

  • CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.15)
project(my_oatpp_api VERSION 1.0 LANGUAGES CXX)

# 使用 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# 设置 vcpkg toolchain(你可以在命令行使用 -DCMAKE_TOOLCHAIN_FILE 指定)
# set(CMAKE_TOOLCHAIN_FILE "../vcpkg/scripts/buildsystems/vcpkg.cmake")

# 找到 oatpp 包(vcpkg 会提供配置文件)
find_package(oatpp 1.3.0 REQUIRED)

file(GLOB DTO_HEADERS "src/dto/*.hpp")

# 指定源文件
set(SRC
    src/App.cpp
    src/AppComponent.hpp
    src/Controller.hpp
    ${DTO_HEADERS}
)

# 创建可执行文件
add_executable(${PROJECT_NAME} ${SRC})

# 链接 oatpp 库
target_link_libraries(${PROJECT_NAME} PRIVATE oatpp::oatpp oatpp::oatpp-test)

# 生成 Oatpp API controller
# 如果使用 codegen endpoint 宏,可以启用以下行:
# oatpp_generate_api_controller_api(${PROJECT_NAME})

构建Build

  • 构建Build
shell
mkdir build && cd build
cmake ..
make
  • 运行产物
shell
./my_oatpp_api
  • Terminal
shell
(myenv) dipeng-xu@Unknown-Mac build % ./my_oatpp_api 
 I |2025-10-08 21:27:07 1759930027513565| Oatpp:Server running on port 8000...

随便写写的,喜欢就好。 使用VitePress构建