1、前情回顾
上一篇我们简述了 (1条消息) 1、wfrest 01_basic_Mr-zhou先生的博客-CSDN博客的基础使用,个人认为在面对一个新的代码时,如果太关注于细节,就会陷入爱情的边缘,会对整体产生不必要的误解,因此学会使用示例,这会让我们更加了解源码的使用,一定要动手敲一敲才会有所得。发一下 http 的介绍链接,大家可以从中了解并学习 HEAD - HTTP | MDN (mozilla.org)
2、HttpServer 类介绍
通常自定义生成静态库或者动态库的时候,我们需要定义外部接口给客户使用,将接口暴露出,但是实现进行隐藏封装,这样的设计是非常常见的,也是一个必要的手段,下面图片是httpserver的类图,这里面暴露的接口主要有3重类型,如下简述。
2.1 普通任务接口
以下接口以GET 来示例讲解,Handler 是函数句柄 std::function函数调用的命名,通过传递参数 访问的API路由 进行lamada 回调,通过 HttpReq *req 请求,HttpResp *resp 应答,resp 自定义将消息封装发送出去 resp->String。计算型Handler和普通的Handler之间就只差了一个参数(第二个参数),就是需要输入计算型任务队列的id,其他都一样
using Handler = std::function<void(const HttpReq *, HttpResp *)>;
void GET(const std::string &route, const Handler &handler)
{
blue_print_.GET(route, handler);
}
// curl -v http://ip:port/data
svr.GET("/data", [](const HttpReq *req, HttpResp *resp)
{
std::string str = "Hello world";
resp->String(std::move(str));
});
void GET(const std::string &route, int compute_queue_id, const Handler &handler)
{
blue_print_.GET(route, compute_queue_id, handler);
}
void Fibonacci(int n, HttpResp *resp)
{
unsigned long long x = 0, y = 1;
if (n <= 0 || n > 94)
{
fprintf(stderr, "invalid parameter");
return;
}
for (int i = 2; i < n; i++)
{
y = x + y;
x = y - x;
}
if (n == 1)
y = 0;
resp->String("fib(" + std::to_string(n) + ") is : " + std::to_string(y) + "\n");
}
svr.GET("/compute_task", 1, [](const HttpReq *req, HttpResp *resp)
{
int num = std::stoi(req->query("num"));
Fibonacci(num, resp);
});
2.2、串行任务接口
串行任务,意思是将任务串连起来执行,先后存在执行顺序。也分成2种
using SeriesHandler = std::function<void(const HttpReq *, HttpResp *, SeriesWork *)>;
void GET(const std::string &route, const SeriesHandler &handler)
{
blue_print_.GET(route, handler);
}
void GET(const std::string &route, int compute_queue_id, const SeriesHandler &handler)
{
blue_print_.GET(route, compute_queue_id, handler);
}
2.3、自定义参数接口
由普通接口和串行接口的自定义传参组成
template<typename... AP>
void GET(const std::string &route, const Handler &handler, const AP &... ap)
{
blue_print_.GET(route, handler, ap...);
}
template<typename... AP>
void GET(const std::string &route, int compute_queue_id,
const Handler &handler, const AP &... ap)
{
blue_print_.GET(route, compute_queue_id, handler, ap...);
}
template<typename... AP>
void GET(const std::string &route, const SeriesHandler &handler, const AP &... ap)
{
blue_print_.GET(route, handler, ap...);
}
template<typename... AP>
void GET(const std::string &route, int compute_queue_id,
const SeriesHandler &handler, const AP &... ap)
{
blue_print_.GET(route, compute_queue_id, handler, ap...);
}
3、Httpserver 关键点
TrackFunc 就是一个追踪函数的设置,可以打印函数的执行过程,void process(HttpTask *task); 为函数的执行过程,BluePrint blue_print_; 蓝图为实现的具体过程接口类
好了,就介绍道这个地方了,剩余的需要自己看,自己理解了。