Oatpp Backend Framework
前置环境安装
安装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...