C++第三方库 【HTTP/HTTPS】— httplib库

目录

认识httplib库

安装httplib库

httplib的使用

 httplib请求类

 httplib响应类

Server类

Client类

httplib库搭建简单服务器&客户端


认识httplib库

httplib库,是一个C++11单头文件的,轻量级的跨平台HTTP/HTTPS库,可以用来创建简单的HTTP服务器和客户端。其被设计成简单易用,适用于快速开发和测试,而不需要深入了解底层的HTTP协议。免去搭建服务器或客户端的时间,更快设计具体的业务处理,提高开发效率。

安装httplib库

GitHub链接

在Linux命令行输入如下命令,安装rz

sudo yum install lrzsz 

 再使用unzip命令解压压缩包

若没有unzip命令,执行如下命令安装

sudo yum install unzip

httplib的使用

 httplib请求类

HTTP请求报文可以参看HTTP请求

httplib中封装了一个结构——Request,用来保存客户端/浏览器发送的HTTP请求的内容。当服务器获取到客户端的请求,httplib会将请求字符串解析成Request

struct Request {//成员变量std::string method;//请求方法std::string path;//请求资源路径——URLHeaders headers;//头部字段std::string body;//正文部分std::string version;//协议版本Params params;//查询字符串MultipartFormDataMap files;//客户端上传文件的信息Ranges ranges;//实现断点续传的请求区间//提供的API//查询头部字段key是否存在bool has_header(const char *key) const;//获取头部字段的valuestd::string get_header_value(const char *key, size_t id = 0) const;//设置头部字段void set_header(const char *key, const char *val);//查询客户端是否上传该文件bool has_file(const char *key) const;//获取文件信息MultipartFormData get_file_value(const char *key) const;};

其中有一个文件结构体和文件结构体数组

struct MultipartFormData {std::string name;//字段名称std::string content;//文件内容std::string filename;//文件名std::string content_type;//文件类型
};
//文件结构体数组
using MultipartFormDataItems = std::vector<MultipartFormData>;

 httplib响应类

HTTP响应报文可以参看HTTP响应

httplib响应类是Responce,需要用户手动填补,httplib返回响应时,会将Responce组织成字符串返回给客户端

struct Response {std::string version;   //协议版本号,默认时http1.1int status = -1;       //响应状态码,std::string reason;    Headers headers;       //响应报头std::string body;      //响应正文std::string location; // 重定向位置
//两个比较重要的API
//以key-val将相应的字段设定到响应报头中
void set_header(const char *key, const char *val);
//设置正文——可以设置类型
void set_content(const std::string &s, const char *content_type);
};

Server类

Server类就是httplib中用于搭建服务器的类

 
class Server {//Handler一个函数指针,它的返回值为void,参数是Request,和Responseusing Handler = std::function<void(const Request &, Response &)>;//Handlers是一个映射表,将请求资源和处理函数映射在一起using Handlers = std::vector<std::pair<std::regex, Handler>>;//将Get方法的请求资源与处理函数加载到Handlers表中Server &Get(const std::string &pattern, Handler handler);Server &Post(const std::string &pattern, Handler handler);Server &Put(const std::string &pattern, Handler handler);Server &Patch(const std::string &pattern, Handler handler);  Server &Delete(const std::string &pattern, Handler handler);Server &Options(const std::string &pattern, Handler handler);//线程池std::function<TaskQueue *(void)> new_task_queue;//搭建并启动httpbool listen(const char *host, int port, int socket_flags = 0);};

首先,Handler是一个回调的函数指针。Handlers是一个映射表。std::regex是正则表达式,用于匹配请求资源,即URL中的path。Handlers将请求的资源和处理函数进行映射。当服务器收到一个请求,解析Request,获取客户端请求的资源路径,在Handlers表中找是否存在映射关系,有则调用对应的Handler回调函数处理请求,无则返回404(请求资源不存在)。

Get,Post,Put,Patch,Delete,Options都是往Handlers表中设置映射关系

请求方法,请求资源和处理函数都是强相关的,如上表:

  • 只有http请求的请求方法是GET,且请求的资源是/Hello/a,服务器才会调用echoHelloA处理请求
  • 只要请求方法和请求资源在Handlers表中找不到映射的处理函数,http服务器就会返回404的http响应,表示请求资源不存在
  • Get("/Hello/a", echoHelloA):将请求方法为GET,请求资源为/Hello/a,与函数echoHelloA注册到Handlers表中

线程池的工作:

  1. 当服务器接收到一个http请求,会将该http请求放入线程池,线程池的线程会调用相应的函数解析http请求,形成一个Request对象
  2. 在Handlers映射表中查找有无对应请求方法和请求资源的处理函数,有则调用处理函数,并构建http响应
  3. 处理函数调用完后,将Responce构建成http响应,并将构建好的http响应返回给客户端

Client类

class Client {//构造一个客户端对象,传入服务器Ip地址和端口Client(const std::string &host, int port);//向服务器发送GET请求Result Get(const char *path, const Headers &headers);//向服务器发送Post请求//path是路径,body是request请求路径//content_length是正文大小//content_type是正文的类型Result Post(const char *path, const char *body, size_t content_length,const char *content_type);//以Post方法上传文件Result Post(const char *path, const MultipartFormDataItems &items);
}

httplib库搭建简单服务器&客户端

搭建服务器:

  1. 定义server对象
  2. 在Handlers表中注册相应请求方法和请求资源的处理函数
  3. listen绑定IP地址和端口号,启动服务器,监听连接和请求
#include <iostream>
#include "httplib.h"
#include <string>int main()
{httplib::Server server;//设置处理函数//GET请求方法,/hello请求资源的映射函数server.Get("/hello", [](const httplib::Request& req, httplib::Response& resp){resp.set_content("Hello World!", "text/plain");resp.status = 200;});//GET请求方法,/number/数字请求资源的映射函数server.Get(R"(/number/(\d+))", [](const httplib::Request& req, httplib::Response& resp){//matches[0]是完整请求资源,后续都是捕捉的参数auto num = req.matches[1];resp.set_content(num, "text/plain");resp.status = 200;});//POST请求方法,/upload请求资源的映射函数server.Post("/upload", [](const httplib::Request& req, httplib::Response& resp){auto ret = req.has_file("file");//查找客户端是否上传file文件if(ret == false){resp.set_content("没有上传file文件", "text/plain");resp.status = 404;return -1;}auto size = req.files.size();const auto& file = req.get_file_value("file");//获取到文件结构体——MultipartFormData //构建Responce响应resp.body.clear();resp.body = file.filename;resp.body += "\n";resp.body += file.content;resp.set_header("Content-Type", "text/plain");resp.status = 200;});//启动服务器——绑定IP地址和端口号server.listen("0.0.0.0", 8080);return 0;
}

简单客户端

  1. 定义Clinet对象,绑定要连接的服务器的IP地址和端口号
  2. 构建请求
  3. 获取响应,处理响应
#include <iostream>
#include <string>
#include "httplib.h"int main()
{//连接服务器httplib::Client client("106.55.180.125", 8080);//构建文件结构体httplib::MultipartFormData item;item.name = "file";item.filename = "Hello.txt";item.content = "Hello World!";item.content_type = "text/plain";//文件结构体数组——传输多个文件httplib::MultipartFormDataItems items;items.push_back(item);//发送请求auto res = client.Post("/upload", items);//接收并处理响应std::cout << res->status << std::endl;std::cout << res->body << std::endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/840414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Text2SQL】WikiSQL 数据集与 Seq2SQL 模型

论文&#xff1a;Seq2SQL: Generating Structured Queries from Natural Language using Reinforcement Learning ⭐⭐⭐⭐⭐ ICLR 2018 Dataset: github.com/salesforce/WikiSQL Code&#xff1a;Seq2SQL 模型实现 一、论文速读 本文提出了 Text2SQL 方向的一个经典数据集 —…

Linux--10---安装JDK、MySQL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 安装JDK[Linux命令--03----JDK .Nginx. 数据库](https://blog.csdn.net/weixin_48052161/article/details/108997148) 第一步 查询系统中自带的JDK第二步 卸载系统中…

Unity Physics入门

概述 在unity中物理属性是非常重要的&#xff0c;它可以模拟真实物理的效果在unity中&#xff0c;其中的组件是非常多的&#xff0c;让我们来学习一下这部分的内容吧。 Unity组件入门篇总目录----------点击导航 Character Controller(角色控制) 说明&#xff1a;组件是Unity提…

华为编程题目(实时更新)

1.大小端整数 计算机中对整型数据的表示有两种方式&#xff1a;大端序和小端序&#xff0c;大端序的高位字节在低地址&#xff0c;小端序的高位字节在高地址。例如&#xff1a;对数字 65538&#xff0c;其4字节表示的大端序内容为00 01 00 02&#xff0c;小端序内容为02 00 01…

【案例分享】医疗布草数字化管理系统:聚通宝赋能仟溪信息科技

内容概要 本文介绍了北京聚通宝科技有限公司与河南仟溪信息科技有限公司合作开发的医疗布草数字化管理系统。该系统利用物联网技术实现了医疗布草生产过程的实时监控和数据分析&#xff0c;解决了医疗布草洗涤厂面临的诸多挑战&#xff0c;包括人工记录、生产低效率和缺乏实时…

DNF手游攻略:角色培养与技能搭配!游戏辅助!

角色培养和技能搭配是《地下城与勇士》中提升战斗力的关键环节。每个职业都有独特的技能和发展路线&#xff0c;合理的属性加点和技能搭配可以最大化角色的潜力&#xff0c;帮助玩家在各种战斗中立于不败之地。接下来&#xff0c;我们将探讨如何有效地培养角色并搭配技能。 角色…

JavaEE之线程(9) _定时器的实现代码

前言 定时器也是软件开发中的一个重要组件. 类似于一个 “闹钟”。 达到一个设定的时间之后&#xff0c;就执行某个指定好的代码&#xff0c;比如&#xff1a; 在受上述场景中&#xff0c;当客户端发出去请求之后&#xff0c; 就要等待响应&#xff0c;如果服务器迟迟没有响应&…

大小字符判断

//函数int my_isalpha(char c)的功能是返回字符种类 //大写字母返回1&#xff0c;小写字母返回-1.其它字符返回0 //void a 调用my_isalpha()&#xff0c;返回大写&#xff0c;输出*&#xff1b;返回小写&#xff0c;输出#&#xff1b;其它&#xff0c;输出&#xff1f; #inclu…

【Linux】Linux的安装

文章目录 一、Linux环境的安装虚拟机 镜像文件云服务器&#xff08;可能需要花钱&#xff09; 未完待续 一、Linux环境的安装 我们往后的学习用的Linux版本为——CentOs 7 &#xff0c;使用 Ubuntu 也可以 。这里提供几个安装方法&#xff1a; 电脑安装双系统&#xff08;不…

深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

virtual box ubuntu20 全屏展示

virtual box 虚拟机 ubuntu20 系统 全屏展示 ubuntu20.04 视图-自动调整窗口大小 视图-自动调整显示尺寸 系统黑屏解决 ##设备-安装增强功能 ##进入终端 ##终端打不开&#xff0c;解决方案-传送门ubuntu Open in Terminal打不开终端解决方案-CSDN博客 ##点击cd盘按钮进入文…

【RabbitMQ】使用SpringAMQP的Publish/Subscribe(发布/订阅)

Publish/Subscribe **发布(Publish)、订阅(Subscribe)&#xff1a;**允许将同一个消息发送给多个消费者 **注意&#xff1a;**exchange负责消息路由&#xff0c;而不是存储&#xff0c;路由失败则消息丢失 常见的**X(exchange–交换机)***类型&#xff1a; Fanout 广播Direc…

【设计模式】JAVA Design Patterns——Callback(回调模式)

&#x1f50d;目的 回调是一部分被当为参数来传递给其他代码的可执行代码&#xff0c;接收方的代码可以在一些方便的时候来调用它。 &#x1f50d;解释 真实世界例子 我们需要被通知当执行的任务结束时。我们为调用者传递一个回调方法然后等它调用通知我们。 通俗描述 回调是一…

试用百川智能的百小应-说的太多,做的太少

“百小应”的品牌标识&#xff08;logo&#xff09;上有一缕黄色&#xff0c;这是王小川特意设计的。他说&#xff0c;其他AI应用都在强调科技感&#xff0c;更愿意用蓝色或者冷色调。但他觉得这一代科技与上个时代不一样&#xff0c;现代科技应该像人&#xff0c;所以选择使用…

Java进阶学习笔记5——Static应用知识:单例设计模式

设计模式&#xff1a; 架构师会使用到设计模式&#xff0c;开发框架&#xff0c;就需要掌握很多设计模式。 在Java基础阶段学习设计模式&#xff0c;将来面试笔试的时候&#xff0c;笔试题目会经常靠到设计模式。 将来会用到设计模式。框架代码中会用到设计模式。 什么是设计…

linux常用软件源码安装-2

jdk、tomcat、Apache、nginx、mysql、redis、maven、nexus安装文档&#xff1a;linux常用软件源码安装 9.sonarqube安装 前置条件&#xff1a;mysql5.6和jdk8 1.下载 官网 2.安装unzip并解压sonarqube&#xff0c;然后移动到/usr/local yum install -y unzip unzip sonarq…

基于Matlab完整版孤立词识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 孤立词识别是语音识别领域的一个重要分支&#xff0c;其目标是将输入的语音信号转换为计算机可…

收入极高的副业兼职,单价179元的养生爆款卖出3000份

做养生赛道切忌不要只靠接广告变现&#xff0c;换个思路以产品为核心&#xff0c;走低粉高变现才是变现效率最高的。 周周近财&#xff1a;让网络小白少花冤枉钱&#xff0c;赚取第一桶金 今天&#xff0c;我们要分析的这位养生博主&#xff0c;仅凭一款售价为179元的温通膏&a…

excel poi的titleRows 和 headRows含义

titleRows 这个参数的意思是&#xff1a;excel标题占多少行&#xff0c;而不是第几行headRows 这个参数的意思是&#xff1a;excel表头占几行&#xff0c;而不是第几行&#xff08;多行的意思是合并的行数&#xff09; 比如有一个excel如下&#xff0c;1-2行是标题&#xff0c…

将 MOV 转换为 MP4 的 10 个最佳工具

在当今的数字时代&#xff0c;内容创作和消费正处于巅峰&#xff0c;对多功能和兼容媒体格式的需求从未如此之高。在众多可用的视频格式中&#xff0c;MOV 和 MP4 因其在各种设备和平台中的广泛使用而脱颖而出。然而&#xff0c;将 MOV 文件转换为更通用兼容的 MP4 格式的需求已…