05 Step-By-Step-Guide解读(上)
05 Step-By-Step-Guide解读(上)
Step-By-Step-Guide主要演示了两个层面的使用,从简单到复杂:
1. 简单使用
1.1 基础
下面演示了如何创建一个基本的http服务,不带任何处理接口。
#include "oatpp/web/server/HttpConnectionHandler.hpp" #include "oatpp/network/Server.hpp" #include "oatpp/network/tcp/server/ConnectionProvider.hpp" void run () { auto router = oatpp::web::server::HttpRouter::createShared (); auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared (router); auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared ({"localhost" , 8000 , oatpp::network::Address::IP_4}); oatpp::network::Server server (connectionProvider, connectionHandler) ; OATPP_LOGI ("MyApp" , "服务器运行在端口 %s" , connectionProvider->getProperty ("port" ).getData ()); server.run (); } int main () { oatpp::base::Environment::init (); run (); oatpp::base::Environment::destroy (); return 0 ; }
1.2.0 响应工厂(ResponseFactory.hpp)
从class ResponseFactory
可以看出,可以有三种响应格式:
状态码
状态码+文本
状态码+DTO+JSON序列化器
它们的本质都是将数据转换成文本响应。
class ResponseFactory {public : static std::shared_ptr<Response> createResponse (const Status &status) ; static std::shared_ptr<Response> createResponse (const Status& status, const oatpp::String& text) ; static std::shared_ptr<Response> createResponse (const Status& status, const oatpp::Void& dto, const std::shared_ptr<data::mapping::ObjectMapper>& objectMapper) ; };
1.2 返回文本格式响应
新增class Handler
和第27行代码。
#include "oatpp/web/server/HttpConnectionHandler.hpp" #include "oatpp/network/Server.hpp" #include "oatpp/network/tcp/server/ConnectionProvider.hpp" class Handler : public oatpp::web::server::HttpRequestHandler {public : std::shared_ptr<OutgoingResponse> handle (const std::shared_ptr<IncomingRequest>& request) override { return ResponseFactory::createResponse (Status::CODE_200, "Hello World!" ); } }; void run () { auto router = oatpp::web::server::HttpRouter::createShared (); router->route ("GET" , "/hello" , std::make_shared <Handler>()); auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared (router); auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared ({"localhost" , 8000 , oatpp::network::Address::IP_4}); oatpp::network::Server server (connectionProvider, connectionHandler) ; OATPP_LOGI ("MyApp" , "Server running on port %s" , connectionProvider->getProperty ("port" ).getData ()); server.run (); } int main () { oatpp::base::Environment::init (); run (); oatpp::base::Environment::destroy (); return 0 ; }
1.3 返回JSON格式响应
新增了DTO类。
修改了handle返回的格式类型。
修改了router->route的参数。
#include "oatpp/parser/json/mapping/ObjectMapper.hpp" #include "oatpp/web/server/HttpConnectionHandler.hpp" #include "oatpp/network/Server.hpp" #include "oatpp/network/tcp/server/ConnectionProvider.hpp" #include "oatpp/core/macro/codegen.hpp" #include OATPP_CODEGEN_BEGIN(DTO) class MessageDto : public oatpp::DTO { DTO_INIT (MessageDto, DTO ) DTO_FIELD (Int32, statusCode); DTO_FIELD (String, message); }; #include OATPP_CODEGEN_END(DTO) class Handler : public oatpp::web::server::HttpRequestHandler {private : std::shared_ptr<oatpp::data::mapping::ObjectMapper> m_objectMapper; public : Handler (const std::shared_ptr<oatpp::data::mapping::ObjectMapper>& objectMapper) : m_objectMapper (objectMapper) {} std::shared_ptr<OutgoingResponse> handle (const std::shared_ptr<IncomingRequest>& request) override { auto message = MessageDto::createShared (); message->statusCode = 1024 ; message->message = "Hello DTO!" ; return ResponseFactory::createResponse (Status::CODE_200, message, m_objectMapper); } }; void run () { auto objectMapper = oatpp::parser::json::mapping::ObjectMapper::createShared (); auto router = oatpp::web::server::HttpRouter::createShared (); router->route ("GET" , "/hello" , std::make_shared <Handler>(objectMapper )); auto connectionHandler = oatpp::web::server::HttpConnectionHandler::createShared (router); auto connectionProvider = oatpp::network::tcp::server::ConnectionProvider::createShared ({"localhost" , 8000 , oatpp::network::Address::IP_4}); oatpp::network::Server server (connectionProvider, connectionHandler) ; OATPP_LOGI ("MyApp" , "Server running on port %s" , connectionProvider->getProperty ("port" ).getData ()); server.run (); } int main () { oatpp::base::Environment::init (); run (); oatpp::base::Environment::destroy (); return 0 ; }