在请求 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,页面输出内容如下: