在请求 URL 时,我们希望返回 json 格式的数据。Oat++序列化的格式是由 Object Mapper 来定义的。使用步骤如下:
- 定义 DTO 数据类,并在该类中定义数据字段
- 在 Hanlder 中构建 DTO 数据对象
- 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,页面输出内容如下: