【c++中间件】cpp-httplib 介绍 && 使用

【c++中间件】cpp-httplib 介绍 && 使用

文章目录

在这里插入图片描述

Ⅰ. cpp-httplib 介绍与安装

C++ HTTP 库(cpp-httplib)是一个轻量级的 C++ HTTP 客户端/服务器库,它提供了简单的 API 来创建 HTTP 服务器和客户端,支持同步和异步操作。

​ 以下是一些关于 cpp-httplib 的主要特点:

  1. 轻量级cpp-httplib 的设计目标是简单和轻量,只需要一个头文件包含即可,不依赖于任何外部库。
  2. 跨平台:它支持多种操作系统,包括 WindowsLinuxmacOS
  3. 同步和异步操作:库提供了同步和异步两种操作方式,允许开发者根据需要选择。
  4. 支持 HTTP/1.1:它实现了 HTTP/1.1 协议,包括持久连接和管道化。
  5. Multipart form-data:支持发送和接收 multipart/form-data 类型的请求,这对于文件上传非常有用。
  6. SSL/TLS 支持:通过使用 OpenSSLmbedTLS 库,cpp-httplib 支持 HTTPSWSS
  7. 简单易用API 设计简洁,易于学习和使用。
  8. 性能:尽管是轻量级库,但性能表现良好,适合多种应用场景。
  9. 社区活跃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 
在这里插入图片描述
在这里插入图片描述

Read more

【动态规划】打家劫舍类问题

【动态规划】打家劫舍类问题

一、按摩师 17.16. 按摩师 题目描述: 题目分析: 1、状态表示 每个预约都只会有两种选择,即选或不选。因此我们可以用  * dp[i][0] 表示不选择第 i 个预约时,最长的预约时长 * dp[i][1] 表示选择第 i 个预约时,最长的预约时长 2、状态转移方程 对于 dp[i][0] : * 如果我们选择了第 i 个预约,那么第  i-1 次预约就一定不会选择,这时我们只需要知道不选第 i-1 次预约时的最长预约时长即可,即 dp[i-1][0] 的值,再加上 num[i]  即可。

By Ne0inhk
【安装教程】Linux系统安装Python

【安装教程】Linux系统安装Python

一、适用环境 1、操作系统:Linux 2、依赖软件:VMware / VirtualBox虚拟机或WSL子系统 二、操作步骤 1、首先,登录管理员用户 sudo su 2、更新软件包及安装开发依赖库 (1)更新软件包索引列表(确保安装时软件保持最新版本) apt-get update (2)安装开发依赖库(为编译软件Python提供编译环境) apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev liblzma-dev libffi-dev libc6-dev 3、下载压缩包及解压等操作 (1)执行命令进入/usr/local路径 cd

By Ne0inhk

Python + Blender 5.0 几何节点全栈实战教程1

前言 1.1 为什么选择 Blender 5.0 + Python? 在三维创作与程序化建模领域,Blender 一直以开源、强大且免费的特性占据核心地位。而 Blender 5.0 对几何节点(Geometry Nodes)的颠覆性更新,彻底打破了 “程序化建模 = 专业门槛” 的固有认知 —— 从 “平面操作” 到 “空间操控” 的体积数据支持,从 “连线迷宫” 到 “模块化复用” 的包与闭包机制,让新手也能快速上手复杂效果,让资深开发者的创意实现效率翻倍。 Python 作为 Blender 的内置脚本语言,通过 bpy 模块实现了对 Blender 全功能的可编程控制。当 Python 的自动化能力与 Blender 5.

By Ne0inhk

【Python】unstructured 库:处理和预处理非结构化数据(如 PDF、Word 文档、HTML、图片等),转换为结构化格式

unstructured 是一个 Python 开源库,设计用于处理和预处理非结构化数据(如 PDF、Word 文档、HTML、图片等),将其转换为结构化格式,方便下游机器学习(ML)或大语言模型(LLM)任务。它提供模块化的组件(称为“bricks”),支持文档分区、清理和格式化,广泛应用于数据管道、RAG(Retrieval-Augmented Generation)系统和文档分析。 以下是对 unstructured 库的详细介绍,包括其功能、用法和实际应用,结合近期信息(截至 2025)。 1. unstructured 库的作用 * 非结构化数据处理:将复杂文档(如 PDF、DOCX、HTML)拆分为结构化元素(如标题、段落、列表、表格)。 * 模块化设计:

By Ne0inhk