【c++中间件】cpp-httplib 介绍 && 使用
文章目录
Ⅰ. cpp-httplib 介绍与安装
C++ HTTP 库(cpp-httplib)是一个轻量级的 C++ HTTP 客户端/服务器库,它提供了简单的 API 来创建 HTTP 服务器和客户端,支持同步和异步操作。
以下是一些关于 cpp-httplib 的主要特点:
- 轻量级:
cpp-httplib的设计目标是简单和轻量,只需要一个头文件包含即可,不依赖于任何外部库。 - 跨平台:它支持多种操作系统,包括
Windows、Linux和macOS。 - 同步和异步操作:库提供了同步和异步两种操作方式,允许开发者根据需要选择。
- 支持 HTTP/1.1:它实现了
HTTP/1.1协议,包括持久连接和管道化。 - Multipart form-data:支持发送和接收
multipart/form-data类型的请求,这对于文件上传非常有用。 - SSL/TLS 支持:通过使用
OpenSSL或mbedTLS库,cpp-httplib支持HTTPS和WSS。 - 简单易用:
API设计简洁,易于学习和使用。 - 性能:尽管是轻量级库,但性能表现良好,适合多种应用场景。
- 社区活跃:
cpp-httplib有一个活跃的社区,不断有新的功能和改进被加入。
安装非常简单,只需要以下命令:
git clone https://github.com/yhirose/cpp-httplib.git Ⅱ. cpp-httplib 使用
下图是 cpp-httplib 的回调处理流程,核心是用一个哈希表来记录不同规则对于的 <正则表达式,回调函数> 的关系!
比如下图我们在 GET 规则中添加了 /hi 和其对应回调函数 HelloWorld,当我们去访问 http://ip地址:端口/hi 的时候,服务器就会执行该回调函数 HelloWorld 将对应的响应填充然后进行返回!
下面介绍以下这个 http 库中的类和接口:
namespace httplib {// 请求数据结构,封装HTTP请求信息structRequest{ std::string method;// 请求方法 (如 GET, POST, PUT, DELETE) std::string path;// 请求的路径 Headers headers;// 请求头 std::string body;// 请求体内容 Params params;// 请求参数};// 响应数据结构,封装HTTP响应信息structResponse{ std::string version;// HTTP版本 (如 "HTTP/1.1")int status =-1;// HTTP响应状态码 (如 200, 404, 500) std::string reason;// 响应状态说明 (如 "OK", "Not Found") Headers headers;// 响应头 std::string body;// 响应体内容// 设置响应体内容以及内容类型voidset_content(const std::string &s,const std::string &content_type);// 设置响应头voidset_header(const std::string &key,const std::string &val);};// 服务器类,处理客户端请求classServer{public:// 请求处理器类型,接收请求并返回响应using Handler = std::function<void(const Request &, Response &)>;// 注册 GET 请求处理函数 Server &Get(const std::string &pattern, Handler handler);// 注册 POST 请求处理函数 Server &Post(const std::string &pattern, Handler handler);// 注册 PUT 请求处理函数 Server &Put(const std::string &pattern, Handler handler);// 注册 DELETE 请求处理函数 Server &Delete(const std::string &pattern, Handler handler);// 启动服务器并监听指定的主机和端口boollisten(const std::string &host,int port);};// 客户端类,发起HTTP请求classClient{public:// 构造函数,指定主机和端口explicitClient(const std::string &host,int port);// 发起 GET 请求 Result Get(const std::string &path,const Headers &headers);// 发起 POST 请求 Result Post(const std::string &path,const std::string &body,const std::string &content_type);// 发起 PUT 请求 Result Put(const std::string &path,const std::string &body,const std::string &content_type);// 发起 DELETE 请求 Result Delete(const std::string &path,const std::string &body,const std::string &content_type);};}测试样例
按照上面图片中提到的服务器搭建流程,我们写一个测试样例:
#include"../header/httplib.h"intmain(){// 1. 实例化服务器对象 httplib::Server server;// 2. 注册回调函数 void(const httplib::Request &, httplib::Response &) server.Get("/hi",[](const httplib::Request &req, httplib::Response &rsp){ std::cout << req.method << std::endl; std::cout << req.path << std::endl;for(auto it : req.headers){ std::cout << it.first <<": "<< it.second << std::endl;} std::string body ="<html><body><h1>Hello lirendada!</h1></body></html>"; rsp.set_content(body,"text/html"); rsp.status =200;});// 3. 启动服务器 server.listen("0.0.0.0",8080);return0;} makefile 文件:
main : main.cc g++ -std=c++17 $^ -o $@ -lpthread