51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

C++ Web Framework Oat++ DTO

在请求 URL 时,我们希望返回 json 格式的数据。Oat++序列化的格式是由 Object Mapper 来定义的。使用步骤如下:

  1. 定义 DTO 数据类,并在该类中定义数据字段
  2. 在 Hanlder 中构建 DTO 数据对象
  3. createResponse 方法第二参数由字符串替换为 DTO 对象,并指定第三个参数。第三个参数为 ObjectMapper 类型,用于将 DTO 类型对象序列化为 json 格式

示例代码如下:

#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"
#include "oatpp/parser/json/mapping/ObjectMapper.hpp"

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

// 必须定义开始
#include OATPP_CODEGEN_BEGIN(DTO)
// 该类定义序列化内容,必须继承 DTO 类
class MessageDTO : public oatpp::DTO {

    // 初始化
    DTO_INIT(MessageDTO, DTO);

    // 定义字段
    DTO_FIELD(Int32, status);
    DTO_FIELD(String, result);
    DTO_FIELD(String, info);

};
// 必须定义结束
#include OATPP_CODEGEN_END(DTO)


class Handler : public oatpp::web::server::HttpRequestHandler {
public:
    std::shared_ptr<OutgoingResponse> handle(const std::shared_ptr<IncomingRequest>& request) override {
        (void)request;

        // 构建 MessageDTO 对象
        auto message = MessageDTO::createShared();
        message->status = 200;
        message->info = "Hello DTO";
        message->result = "OK";

        // 构建 ObjectMapper 对象,该对象用于序列化 MessageDTO 对象
        auto object_mapper = oatpp::parser::json::mapping::ObjectMapper::createShared();

        /*
         * createResponse 有三个版本的重载函数,下面这个重载的函数需要传递第三个参数 ObjectMapper
         * 用于将 DTO 类型的数据对象转换为 json 格式
         */
        return ResponseFactory::createResponse(Status::CODE_200, message, object_mapper);
    }
};


void run() {

    // 1. 创建路由对象
    auto router = oatpp::web::server::HttpRouter::createShared();
    router->route("GET", "/hello", std::make_shared<Handler>());

    // 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;
}

在浏览器请求:localhost:8000/hello,页面输出内容如下:


赞(1)
未经允许不得转载:工具盒子 » C++ Web Framework Oat++ DTO