cpp-httplib库的原理,听说你还不会开源库?
- 介绍
- httplib.h头文件的处理流程
- httplib.h头文件的组成
- httplib.h头文件搭建服务端与客户端的原理
- Get接口
- listen(0.0.0.0,8989)接口
介绍
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();
Post();
Put();
....
listen(host,port);
};
客户端类的组成
class 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
12 httplib::Server svr;
13 svr.Get("/abc", func);
14
15 svr.listen("0.0.0.0",8989);
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
12 httplib::Server svr;
13 svr.Get("/abc", func);
14
15 svr.listen("0.0.0.0",8989);
16
17 return 0;
18 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)