cpp-httplib库简单原理,听说你还不会开源库?

2023-05-16

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客户端搭建的步骤

  1. 组织http协议格式的请求数据
  2. 搭建tcp客户端
  3. 发送组织好的http请求数据
  4. 等待服务端响应,接收响应数据
  5. 对响应数据的解析

2. 最简单的http服务端搭建的步骤

  1. 搭建tcp服务端
  2. 等待接收客户端发送的数据
  3. 按照http协议格式,对数据进行解析(格式按照: 请求方法 URL 协议版本\r\n 头部\r\n 正文)
  4. 根据请求的资源路径以及查询字符串以及正文,进行业务处理
  5. 组织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();   // 请求方法 Get
	Post();  // 请求方法 Post
	Put();   // 请求方法 Put
	....
	listen(host,port); // 监听(传入某个主机,端口)
};

客户端类的组成

class Client
{
	//创建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   //创建httplib中的server类对象,使用该类对象,模拟创建一个http服务器
   12   httplib::Server svr;
   13   svr.Get("/abc", func);//URL路径为/abc,回调函数为func
   14 
   15   svr.listen("0.0.0.0",8989);//表示监听8989端口任何ip都可以访问
   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端口,等待客户端传来数据。若接收到了客户端的请求数据,则服务端创建一个线程去处理这个请求。

  1. 按照http协议格式解析请求数据,将解析的结果放入到一个实例化的Request对象中(包含请求方法,资源路径,查询字符串,头部信息,正文…)–得到了req
  2. 去srv对象中的那张map表中查找
  3. 根据req中的请求方法,以及资源路径,判断map中是否有对应的处理函数。若请求方法与资源路径都对应成功,则将req对象传入这个回调函数,去处理这次请求。
  4. 在这个用户自定义的回调函数中,处理完毕之后,会填充一个rsq对象。到此,回调函数运行完毕
  5. 回调函数运行完毕,则得到了一个已经填充了各种响应信息的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   //创建httplib中的server类对象,使用该类对象,模拟创建一个http服务器
   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(使用前将#替换为@)

cpp-httplib库简单原理,听说你还不会开源库? 的相关文章

  • RoboMaster电控学习笔记——电机控制(1-CAN)

    Robomaster官方提供了一系列性能强大的直流无刷减速电机及配套电调 xff0c 这里介绍三款步兵上用的电机 amp 电调 M3508电机 amp C620电调 xff0c GM6020电机 xff08 内部集成电调 xff09 xff
  • linux下 在同一个线程建立TCP连接

    要实现在一个线程里建立TCP连接 xff0c 需要注意accept应在connect之后 xff0c 所以我将accept放在了tcp client里 这样 xff0c 才能得到accept返回的fd xff0c 从而进行read span
  • 【cpprestsdk】浅谈cpprestsdk线程池及使用

    cpprestsdk根据include文件夹可以看到共包含两部分内容 xff1a 1 pplx 2 cpprest pplx threadpool h源代码中创建线程池有两种方式 1 通过construct接口创建 xff0c 返回一个un
  • 丹尼带你入坑无人机3 - 四轴配件简介

    知道你的四轴里面每个小东东都是干嘛用的吗 xff1f 麻雀虽小 xff0c 五脏得全 简单说 xff0c 飞控就是大脑 xff0c 它能知道每一时刻无人机的状态 xff0c 并且给下一时刻需要作出的动作发出指令 电调就好比是神经单元 xff
  • Linux内核简单分析(2)——进程调度与切换

    进程的调度与切换是一个很复杂的话题 xff0c 这里我更关心内核是如何实现的 xff0c 而不是使用了什么策略 xff0c 所以只讲进程的组织和切换方式 xff0c 而对调度程序的实现和算法不作分析 进程调度可参考 xff1a Linux进
  • 【矩阵路径】不知道回溯怎么写?进来看模板就对了!

    矩阵路径 不知道回溯怎么写 xff1f 进来看模板就对了 xff01 这几天做了几道回溯算法的题目 xff0c 发现理解递归关键步骤的结果很重要 xff0c 试图摸索出一套模板 xff0c 思考的方法都是搭建好框架 xff0c 然后逐步细想
  • gloox 获取花名册和联系人出席信息

    gloox 之 RosterManager 此类实现了jabber iq roster名空间中的Jabber XMPP花名册操作 它继承了 IqHandler PresenceHandler SubscriptionHandler 和 Pr
  • TCP/IP网络编程笔记--套接字和标准I/O

    一 定义 xff1a 标准I O是标准C库提供的对文件操作的函数接口 二 常见的标准I O函数 xff1a 1 fopen xff08 xff09 函数原型 xff1a FILE fopen xff08 const char path xf
  • C语言位运算符:与、或、异或、取反、左移和右移

    文章转载于 博客园 博主 夜真寒 链接地址 xff1a http www cnblogs com yezhenhan archive 2011 11 06 2238452 html 语言位运算符 xff1a 与 或 异或 取反 左移和右移
  • Linux系统之常用命令

    这几天在看教学视频 xff0c 里面在讲一些linux系统常用的命令 xff0c 虽然有一部分都很熟悉了 xff0c 但也有一些不太熟悉 xff0c 因此来总结一下 注 xff1a 本文并非介绍了linux下所有常用的命令 xff0c 而是
  • C++学习笔记--尽量以const,enum,inline替换#define

    本文内容整理自 Effective C 43 43 中文版 xff0c 主要讲述 C 43 43 中在一些场合使用 const enum inline 来替换 define 所带来的好处 1 const 当我们编写这样一条代码 xff1a
  • ROS分布式通信(可以查看话题但主机接受不到从机传输的消息)

    提示 xff1a 想要将nano上的传感器数据发回pc端从机进行计算 xff0c 但是pc端计算完后发布话题 xff0c nano上的主机可以查看到这个话题但却收不到消息 xff08 已经在主机配置好相应的消息类型 xff09 前言 提示
  • 用户身份认证

    0 背景 计算机本身无法判断坐在显示器前的使用者的身份 xff0c 也无法确认网络的另一端的是谁 为了明确是谁在访问服务器 xff0c 必须让客户端自报家门 通常核对一些登录者本人的信息 xff1a 密码 xff1a 只有本人知道的字符串信
  • 一款用过就舍不得换的播放器-potplayer(中文绿色版)/win64

    PotPlayer 是 KMPlayer 的原制作者姜龙喜先生 xff08 韩国 xff09 进入 Daum 公司后的新一代网络播放器 PotPlayer 的优势在于强大的内置解码器 xff1b 而 KMPlayer 的优势在于强大的定制能
  • (一) odroid-xu4交叉编译过程

    目录 文章目录 目录前言Toolchain安装过程总结 前言 现在转到ODROID xu4的平台 xff0c 需要安装ODROID xu4的交叉编译环境 xff0c 特此记录 xff01 本文参照ODROID Wiki Toolchain安
  • 使用OPENMV控制云台自动追踪Apriltag,测出与Apriltag距离并且通过串口发送给单片机。

    使用openmv控制云台自动跟踪Apriltag xff0c 并且将openmv与Apriltag距离通过串口发送到单片机 如果有openmv的同学直接将main py和pid py复制到flash中就可以了 注意 xff01 Aprilt
  • ubuntu 配置http

    1 去服务器上购买免费https服务并配置域名等 2 根据自己的网站服务器来选择下载不同的ssl证书 apache证书包括 1 root bundle crt 证书文件 2 xxx xxx xxx crt 证书文件 3 xxx xxx xx
  • C++中istringstream、ostringstream、stringstream详细介绍和使用

    C 43 43 中istringstream ostringstream stringstream介绍和使用 1 基于控制台的I O 注意 xff1a 提取符 34 gt gt 从流中提取数据时跳过输入流中的空格 tab键 换行符等空白字符
  • java httpClient Digest Auth 认证

    技术交流QQ群 933925017 java httpClient Digest Auth 认证 因为项目需要 请求海康摄像头 进行抓图以及云台控制等功能 海康有http协议 但是需要进行请求头认证 因为海康给的资料已经过时 所以找了很久
  • 锂电池充电过程及电路设计

    通常为了提高电池充电时的可靠性和稳定性 xff0c 我们会用电源管理芯片来控制电池充电的电压与电流 xff0c 但是在使用电源管理芯片设计充电电路时 xff0c 我们往往对充电电路每个时间段的工作状态及电路设计注意事项存在一些困惑 1 电池

随机推荐

  • 0Ω电阻到底能过多大电流

    0 电阻到底能过多大电流 xff1f 这个问题想必每位硬件工程师都查过 而与之相关的还有一个问题 xff0c 那就是0 电阻的阻值到底有多大 xff1f 这两个问题本来是很简单的 xff0c 答案应该也是很明确的 xff0c 但网上网友却给
  • linux进程控制函数--fork,exec,exit,wait,sleep

    1 fork 在linux系统中 xff0c 用户创建进程的唯一方法就是使用系统调用fork xff0c 大概要进行下面的操作 lt 1 gt 分配表项 xff0c 一个用户的进程项是有限的 xff1b lt 2 gt 创建子进程的进程标识
  • linux的用户模式和内核模式

    MS DOS等操作系统在单一的CPU模式下运行 xff0c 但是一些类Unix的操作系统则使用了双模式 xff0c 可以有效地实现时间共享 在Linux机器上 xff0c CPU要么处于受信任的内核模式 xff0c 要么处于受限制的用户模式
  • 阿里内推面试经历

    写在最前 其实主观上并不是很想写 xff0c 但坚持写完是希望能分享给准备进互联网实习或工作的同学或朋友一些经验和收获
  • 关于利用Openmp中使用的时间函数

    Openmp是一项并行化技术 xff0c 是可以提高串行化程序的运行效率的 xff0c 但需要使用正确的时间函数来进行衡量 首先 xff0c 先提出一个unix linux下的内核时间获取函数和一个omp h的一个库函数 1 clock 函
  • mybatis之映射文件

    mybatis框架如何实现java语句与数据库语句的分离 映射文件 通过在映射文件中写入动态sql语句 xff0c 完成增删改查操作 映射文件中的元素都包含在根节点 lt mapper gt lt mapper gt 下 xff0c map
  • mybatis之高级查询

    Mybatis中的高级查询主要通过关联查询 xff0c 集合查询或鉴别器来完成 其核心就是之前提到的通过resultMap标记来完成 1 关联查询 关联查询一般有三种方式 xff1a a 联合查询 利用resultMap的map xml中的
  • mybaits之动态sql

    mybaits除了提供连接数据库 xff0c 使java和数据库语句分离之外 xff0c 还有一个显著的特点就是使用动态sql语句 这些sql语句均写在map映射文件中 xff0c 并通过一系列标记来完成 1 if标记 常用形式 xff1a
  • 平衡二叉树-的四种旋转调整(代码,图解)

    平衡二叉树 的四种旋转调整 xff08 代码 xff0c 图解 xff09 1 右单旋 xff1a 新插入节点插入在较高左子树的左侧 xff08 左左右 xff09 xff0c 插入新节点二十 xff1a 1 修改parent和curLR的
  • 头文件里一般会加入的宏定义,为了避免一个头文件被重复调用

    华清视频里讲的 xff0c 写代码的时候 xff0c 头文件一般地都会加上一个类似这样的宏 xff0c 希望你从此以后再写头文件 xff0c 加上一个宏 加了这个有一个好处 xff0c 当你第一次包含tree h的时候 xff0c 如果没定
  • 自己组装Pixhawk F450无人机的一些细节

    首先参考文档为 xff1a 1 https mp weixin qq com s VXKU kIB v i0AX3zgtLig 2 https mp weixin qq com s Qzzl dQ6Tz2pXNp7Oj0lTg 3 http
  • 电机和桨叶要搭配选择

    拍自 四旋翼无人机的制作与飞行
  • 接收机PPM与SBUS

    最开始是自己弄ACfly的飞控时发现插接收机有两个位置 xff0c 一个PPM一个SBUS xff0c 我想直接移植Pixhawk的接收机或者无名的接收机到ACfly模块上 我最后发现Pixhawk和无名的也是留了两个给接收机 xff08
  • 现在发现如果无人机的电机不同,浆可能是不能混用的。

    现在发现如果无人机的电机不同 xff0c 浆可能是不能混用的 孔位不同 xff0c 我之前在无名那里买了很多浆 xff0c 觉得这次F330的浆没了可以用那个替 xff0c 我刚刚试了下发现插不进去 xff0c 不能通用 包括我刚才在店家那
  • 无人机电池似乎可以并联,串联组合

    之前总是见到这种奇怪的线 xff0c 一直不知道作什么用 xff0c 现在大概清楚了 是不是这样可以实现更长时间的续航 xff0c 我之前再ACfly的群里看到一个人的六轴是上面放了两个电池的 xff0c 他这可能也是并联的
  • 任务的三要素是任务主体函数,任务栈和任务控制块

    任务的三要素是任务主体函数 xff0c 任务栈和任务控制块 由xTaskCreateStatic 函数来把三者联合起立 下面拍自野火的 FreeRTOS内核实现与应用开发实战指南
  • 如何用Realsense D435i运行VINS-Mono等VIO算法 获取IMU同步数据

    摘自 xff1a https blog csdn net qq 41839222 article details 86552367 如何用Realsense D435i运行VINS Mono等VIO算法 获取IMU同步数据 Manii 20
  • Opencv安装与环境配置

    转载自 xff1a https blog csdn net sm16111 article details 81238324 Opencv安装与环境配置 代码敌敌畏 2018 07 27 15 46 24 50411 收藏 94 分类专栏
  • 串口参数详解:波特率,数据位,停止位,奇偶校验位

    转载自 xff1a https blog csdn net sinat 35705952 article details 89034455 串口参数详解 xff1a 波特率 xff0c 数据位 xff0c 停止位 xff0c 奇偶校验位 W
  • cpp-httplib库简单原理,听说你还不会开源库?

    cpp httplib库的原理 听说你还不会开源库 xff1f 介绍httplib h头文件的处理流程httplib h头文件的组成httplib h头文件搭建服务端与客户端的原理Get接口listen 0 0 0 0 8989 接口 介绍