oatpp的初步探索

一些基本概念

CORS(跨域资源共享):浏览器的安全特性,允许你控制哪些外部域名访问你的API

API路由:简单来说就是根据客户端发起的请求(包括请求的方法,如GET、POST、PUT等,以及请求的URL路径)将请求映射到不同的处理逻辑中:

1.匹配客户端发来的请求

2.根据请求的路径和方法,找到并执行相应的代码(处理逻辑)

3.返回一个响应给客户端

代码解析

1
2
3
4
5
6
7
8
#Declare Endpoint
ENDPOINT("PUT", "/users/{userId}", putUser,
PATH(Int64, userId),
BODY_DTO(Object<UserDto>, userDto))
{
userDto->id = userId;
return createDtoResponse(Status::CODE_200, m_database->updateUser(userDto));
}

本段代码的作用是声明一个HTTP请求的API路由:

  • put: 说明这是一个HTTP PUT请求, 用于更新资源
  • /users/{userId}: 定义了API的路径,其中{userId}表示特定的用户,用来定位特定用户
  • putUser: 处理该请求的函数或者方法
  • PATH(Int64, userId): ;将路径中提取的参数userId绑定到Int64类型的userId变量中
  • BODY_DTO(Object<UserDto>, userDto): 请求体中的数据会被反序列化为一个UserDto对象,并包装在Object类型中。可以通过userDto访问请求体中的数据并进行处理,Object是oatpp框架中的一个智能指针类型

我们可以从这里得到ENDPOINT宏的参数说明和用法

1
ENDPOINT("<http-method>", "<path>", <method-name>, <optional param-mappings>)

当然你也可以直接在源码中找到ENDPOINT的定义:

1
2
3
4
5
6
7
8
 * Codegen macro to be used in `oatpp::web::server::api::ApiController` to generate Endpoint.
* @param METHOD - Http method ("GET", "POST", "PUT", etc.).
* @param PATH - Path to endpoint (without host).
* @param NAME - Name of the generated method.
* @return - std::shared_ptr to &id:oatpp::web::protocol::http::outgoing::Response;.
*/
#define ENDPOINT(METHOD, PATH, ...) \
OATPP_MACRO_EXPAND(OATPP_MACRO_MACRO_BINARY_SELECTOR(OATPP_MACRO_API_CONTROLLER_ENDPOINT_MACRO_, (__VA_ARGS__)) (METHOD, PATH, __VA_ARGS__))

这个宏定义一个HTTP endpoint,在ApiController中处理不同的HTTP方法,根据提供的HTTP方法和路径,利用多重宏选择机制和宏展开来生成适合的代码