cpp-httplib库的原理,听说你还不会开源库?
介绍
cpp-httplib是一个c++封装的http库,使用这个库可以在windows平台下完成http客户端、http服务端的搭建。
在p2p点对点下载器的项目中,我们只需用到cpp-httplib中的 httplib.h这个头文件,所以我们在这里只讲一下httplib搭建tcp客户端与服务器的原理
安装httplib:
git clone https://gitee.com/iqxg/cpp-httplib.git
httplib.h头文件的处理流程
1. 最简单的http客户端搭建的步骤
- 组织http协议格式的请求数据
- 搭建tcp客户端
- 发送组织好的http请求数据
- 等待服务端响应,接收响应数据
- 对响应数据的解析
2. 最简单的http服务端搭建的步骤
- 搭建tcp服务端
- 等待接收客户端发送的数据
- 按照http协议格式,对数据进行解析(格式按照: 请求方法 URL 协议版本\r\n 头部\r\n 正文)
- 根据请求的资源路径以及查询字符串以及正文,进行业务处理
- 组织http协议格式的响应,返回给客户端(协议版本 状态码 描述\r\n 头部)
httplib.h头文件的组成
httplib.h头文件的组成主要包含有以下四个类
| 类 | 类名 |
|---|---|
| class Request | 请求数据类 |
| class Response | 回复数据类 |
| class Server | 服务端类 |
| class Client | 客户端类 |
发送请求类的组成
class Request
{
std::string method; // 请求方法
std::string path; // 请求路径
map<std::string, std::string> param; // 查询字符串(查询字符串中)
map<std::string, std::string> headers;// 键值对头部
std::string body; //正文
};
回复数据类的组成
class Response
{
int status; //返回的状态码
map<std::string,std::string> headers; //返回的价值对头部
std::string body; //正文
};
服务端类的组成
class Server()
{
Get(); // 请求方法 Get
Post(); // 请求方法 Post
Put(); // 请求方法 Put
....
listen(host,port); // 监听(传入某个主机,端口)
};
客户端类的组成
class Client
{
//创建client
Client(host,port);
Get()
Post()
Put()
...
};
httplib.h头文件搭建服务端与客户端的原理
main.cpp中使用httplib搭建了一个http服务器
1 #include <stdio.h>
2 #include "httplib.h"
3 void func(const httplib::Request& req, httplib::Response& resp)
4 {
5 const char* BaiDuURL = "https://www.baidu.com/";
6 resp.set_redirect(BaiDuURL);//重定向到百度
7 }
8
9 int main()
10 {
11 //创建httplib中的server类对象,使用该类对象,模拟创建一个http服务器
12 httplib::Server svr;
13 svr.Get("/abc", func);//URL路径为/abc,回调函数为func
14
15 svr.listen("0.0.0.0",8989);//表示监听8989端口任何ip都可以访问
16
17 return 0;
18 }
输入前:

输入后:

Get接口
Get表达式: Get( 请求资源路径path, 回调函数指针)
Server对象中 :Get接口的作用就是将资源路径“/abc”以及请求方法"GET"还有回调函数"func",在srv对象中的map表中存储起来。
注意:
服务端首先Get(),先注册对应关系,先告诉自己的服务器,当我们遇到什么请求方法,请求什么资源,在回调什么函数。全部都记录在map中。当listen监听的时候,才建立起服务端。
若服务端收到了http请求,解析之后。若请求中的path,对应了Get接口传入的path(也就是能在map中找到对应关系),则服务端会创建一个线程回调这个传入的函数helloworld()对这次的请求进行业务处理。
listen(0.0.0.0,8989)接口
listen(0.0.0.0,8989)接口功能: 搭建tcp服务器,监听本机所有网卡8989端口,等待客户端传来数据。若接收到了客户端的请求数据,则服务端创建一个线程去处理这个请求。
- 按照http协议格式解析请求数据,将解析的结果放入到一个实例化的Request对象中(包含请求方法,资源路径,查询字符串,头部信息,正文…)–得到了req
- 去srv对象中的那张map表中查找
- 根据req中的请求方法,以及资源路径,判断map中是否有对应的处理函数。若请求方法与资源路径都对应成功,则将req对象传入这个回调函数,去处理这次请求。
- 在这个用户自定义的回调函数中,处理完毕之后,会填充一个rsq对象。到此,回调函数运行完毕
- 回调函数运行完毕,则得到了一个已经填充了各种响应信息的rsq对象 通过这个rsq对象,组织http响应发送给客户端。

1 #include <stdio.h>
2 #include "httplib.h"
3 void func(const httplib::Request& req, httplib::Response& resp)
4 {
5 const char* html = "<html><h2>hello! world!</h2></html>";
6 resp.set_content(html, strlen(html), "text/html");
7 }
8
9 int main()
10 {
11 //创建httplib中的server类对象,使用该类对象,模拟创建一个http服务器
12 httplib::Server svr;
13 svr.Get("/abc", func);
14
15 svr.listen("0.0.0.0",8989);
16
17 return 0;
18 }
1万+

被折叠的 条评论
为什么被折叠?



