【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

Python + AI:打造你的智能害虫识别助手

Python + AI:打造你的智能害虫识别助手

Python + AI:打造你的智能害虫识别助手 在农业生产中,病虫害是影响作物产量和品质的“隐形杀手”。传统的害虫识别依赖人工巡查,不仅耗时耗力,还容易因经验不足导致误判、漏判。而随着智慧农业的普及,AI技术正成为破解这一难题的关键——今天,我们就用Python从零搭建一个智能害虫识别助手,让电脑替你“火眼金睛”辨害虫,轻松搞定农作物病虫害预警! 一、为什么要做这个项目? 智慧农业的核心是“精准、高效、低成本”,而害虫识别正是其中的典型场景: * 对农户:无需专业植保知识,拍照就能识别害虫种类,快速匹配防治方案; * 对开发者:这是一个“小而美”的实战项目,覆盖AI开发全流程,从数据处理到模型部署,学完就能落地; * 技术价值:融合Python、深度学习、Web部署,是入门AI+垂直领域应用的绝佳案例。 这个项目不需要你有深厚的AI功底,只要掌握Python基础,跟着步骤走,就能做出一个能实际使用的智能识别工具。 二、项目核心技术栈 先明确我们要用到的工具,都是行业主流、

By Ne0inhk
C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数

C++中的父继子承:继承方式实现栈及同名隐藏和函数重载的本质区别, 派生类的4个默认成员函数

🎬 胖咕噜的稞达鸭:个人主页 🔥 个人专栏: 《数据结构》《C++初阶高阶》《算法入门》 ⛺️技术的杠杆,撬动整个世界! 学习完本文,你将知道:(各位大佬预知答案几何请移步文章结尾!) 1. 当子类继承了父类,父类的私有成员在子类中是不可见的,所以父类的私有成员在子类中有没有被继承下来? 2. 子类对象一定比父类大? 3. 函数重载和函数隐藏的区别是什么?同名了有什么影响? 4. 派生类构造函数初始化列表的位置必须显式调用基类的构造函数,已完成基类部分成员的初始化? 5. 派生类构造函数先初始化子类成员,再初始化基类成员?派生类对象构造函数先调用子类构造函数,在调用基类构造函数? 接着来步入今天的正文: 面向对象三大特性:封装,继承,多态 我们之前学过了封装,类的定义是一个封装,迭代器实现也是一个封装,屏蔽了底层的实现细节。模板的使用也是一个封装。接下来讲解面向对象第二大特性:继承。 继承的定义: 假设大学学生和大学的老师,作为一个人的共性,都有姓名,住址和电话号码,但是不同的是,老师授课有职称,学生有学号,这是老师和学生不同的地方。

By Ne0inhk

Clang 17正式发布:C++26十大新特性你必须马上掌握

第一章:Clang 17正式发布:C++26新特性的整体概览 Clang 17 的正式发布标志着对 C++26 标准早期特性的全面支持迈出了关键一步。作为 LLVM 项目的重要组成部分,Clang 17 不仅提升了编译性能与诊断能力,更率先实现了多项处于提案阶段的 C++26 核心语言特性,为开发者提供了前沿的实验平台。 核心语言特性的演进 C++26 正在推进一系列旨在提升代码简洁性与安全性的变更。Clang 17 已初步支持以下关键特性: * 类模板参数推导(CTAD)在别名模板中的扩展应用 * 隐式移动的进一步放宽规则,减少不必要的拷贝操作 * 基于范围的循环支持初始化语句(类似 if 和 switch 的 init-statement) 模块化系统的增强 Clang 17 深化了对 C++20 模块的支持,并为 C+

By Ne0inhk
C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

📚 本文主要总结了一些常见的C++面试题,主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能,掌握这些内容,基本上就满足C++的岗位技能(红色标记为重点内容),欢迎大家前来学习指正,会不定期去更新面试内容。  Hi~!欢迎来到碧波空间,平时喜欢用博客记录学习的点滴,欢迎大家前来指正,欢迎欢迎~~ ✨✨ 主页:碧波 📚 📚 专栏:C++ 系列文章 目录 一、C ++ 语法基础 🔥 谈谈变量的使用和生命周期,声明和初始化 🔥 谈谈C++的命名空间的作用 🔥  include " " 和 <> 的区别 🔥 指针是什么? 🔥 什么是指针数组和数组指针 🔥 引用是什么? 🔥 指针和引用的区别 🔥 什么是函数指针和指针函数以及区别 🔥 什么是常量指针和指针常量以及区别 🔥 智能指针的本质是什么以及实现原理 🔥 weak_ptr 是否有计数方式,在那分配空间? 🔥 类型强制转换有哪几种? 🔥 函数参数传递时,

By Ne0inhk