云备份day03

📟作者主页:慢热的陕西人

🌴专栏链接:C++云备份项目

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

主要内容介绍了第三方库httplib的一些内容,以及实现了一个简单的CS例子

在这里插入图片描述

文章目录

  • 云备份day03
    • 1.httplib库
    • 2.httplib实现server和client
      • 2.1httplib实现server端
      • 2.2httplib实现client端

云备份day03

1.httplib库

httplib 库,一个 C++11 单文件头的跨平台 HTTP/HTTPS 库。安装起来非常容易。只需包含 httplib.h 在你的代码
中即可。
httplib 库实际上是用于搭建一个简单的 http 服务器或者客户端的库,这种第三方网络库,可以让我们免去搭建服
务器或客户端的时间,把更多的精力投入到具体的业务处理中,提高开发效率。

namespace httplib
{
    struct MultipartFormData
    {
        std::string name;
        std::string content;
        std::string filename;
        std::string content_type;
    };
    using MultipartFormDataItems = std::vector<MultipartFormData>;
    
    struct Request
    {
        std::string method; //请求方法
        std::string path;   //url
        Headers headers;    //头部字段
        std::string body;   //正文->有效载荷
        // for server
        std::string version;//协议版本
        Params params;	    //查询字符串
        MultipartFormDataMap files;//保存的是客户端上传文件的信息
        Ranges ranges;      //用于实现断点续传的文件请求的区间
        bool has_header(const char *key) const;
        std::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 Response	
    {
        std::string version;   //协议版本
        int status = -1;	  //响应状态码
        std::string reason;   //
        Headers headers;	  //头部字段
        std::string body;	  //响应给客户端的正文
        std::string location; // Redirect location
        void set_header(const char *key, const char *val); //设置头部字段
        void set_content(const std::string &s, const char *content_type); //设置正文
    };
    
    class Server
    {
        using Handler = std::function<void(const Request &, Response &)>; //函数指针类型
        using Handlers = std::vector<std::pair<std::regex, Handler>>; //请求与处理函数的映射表
        std::function<TaskQueue *(void)> new_task_queue; //线程池---用于处理请求
        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);
        bool listen(const char *host, int port, int socket_flags = 0); //搭建并启动http服务器
    };
	//用于搭建http客户端
    class Client
    {
        Client(const std::string &host, int port); //传入服务器的ip地址和端口
        Result Get(const char *path, const Headers &headers); //向服务器发送get请求
        Result Post(const char *path, const char *body, size_t content_length,
                    const char *content_type);
        Result Post(const char *path, const MultipartFormDataItems &items);  //post请求提交多区域数据,常用于多文件上传
    }
}
  • Request

    Request结构体的作用:
    1.客户端保存的所有http请求相关信息,最终组织http请求发送给服务器
    2.服务器收到http请求之后进行解析,将解析的数据保存在 Request结构体内部,待后续处理

  • Response

    Response结构体的作用:
    用户将响应数据放到结构体中,httplib会将其中的数据按照http响应的格式组织成http响应
    然后发送给客户端

  • Server:

    server类的功能:用于搭建http的服务器

    **1.hander 函数指针类型:**定义了一个http请求处理回调函数的方式
    函数指针类型:定义了一个http请求处理回调函数格式httplib搭建的服务器收到请求后,进行解析,得到一Reques结构体:

    其中包含了请求数据根据请求数据我们就可以处理这个请求了,这个处理函数定义的格式就是Handler格式
    void(const Request &,Response &)
    Request参数,1保存请求数据,让用户能够根据请求数据进行业务处理。
    Response参数,需要用户在业务处理中,填充数据,最终要响应给客户端
    2.Handlers 是一个请求路由数组:
    其中包含两个信息std::vector<std::pair<std::regex,Handler>>
    regex:正则表达式-用于匹配http请求资源路径
    Handler:请求处理函数指针可以理解,Handlers是一张表,映射了一个客户端请求的资源路径和一个处理函数(用户自己定义的函数)
    当服务器收到请求解析得到Request就会根据资源路径以及请求方法到这张表中查看有没有对应的处理函数
    如果有则调用这个函数进行请求处理,无则响应404.

    **处理流程:**线程池,处理http请求

    httplib收到一个新建链接,则将新的客户端连接抛入到线程池中

    线程池中线程的工作:

    ​ ①接收请求,解析请求,得到Request结构体也就是请求的数据

    ​ ②在Handlers映射表中,根据请求信息查找处理函数,如果有则调用函数处理
    void(const Request &, Response &)

    ​ ③当处理函数调用完毕根据函数返回的Response结构体中的数据组织http响应发送给客户端

2.httplib实现server和client

2.1httplib实现server端

#include"httplib.h"

using namespace std;
using namespace httplib;

// 处理 "/hi" 路径的 GET 请求,返回 "hello_world!"
void Hello(const Request& req, Response& rsp)
{
    rsp.set_content("hello_world!", "text/plain");
    rsp.status = 200;
}

// 处理 "/numbers/{num}" 路径的 GET 请求,返回匹配到的数字
void Numbers(const Request& req, Response& rsp)
{
    auto num = req.matches[1]; // 0 保存的是整体的 path,往后的下标中保存的是数据
    rsp.set_content(num, "text/plain");
    rsp.status = 200;
}

// 处理 "/multipart" 路径的 POST 请求,返回上传的文件名和内容
void Multipart(const Request& req, Response& rsp)
{
    auto ret = req.has_file("file");
    if (ret == false)
    {
        cout << "not file upload" << endl;
        rsp.status = 400;
        return;
    }

    const auto& file = req.get_file_value("file");
    rsp.body.clear();
    rsp.body = file.filename; // 文件名称
    rsp.body += "\n";
    rsp.body += file.content; // 文件内容
    rsp.set_header("Content-Type", "text/plain");
    rsp.status = 200;
    return;
}

int main()
{
    Server server; // 实例化一个 server 对象用于搭建服务器

    server.Get("/hi", Hello); // 注册一个针对 "/hi" 的 GET 请求的处理函数映射关系
    server.Get(R"(/numbers/(\d+))", Numbers); 
    server.Post("/multipart", Multipart);
    server.listen("0.0.0.0", 9090);
    return 0;
}

2.2httplib实现client端

#include"httplib.h"  // 引入 httplib 库的头文件

using namespace std;  // 使用标准命名空间

#define SERVER_IP "117.72.37.100"  // 定义服务器 IP 地址常量
#define SERVER_PORT 9090  // 定义服务器端口号常量

int main()
{
    // 实例化一个 httplib 客户端对象,并指定服务器的 IP 地址和端口号
    httplib::Client client(SERVER_IP, SERVER_PORT);

    // 创建一个多部分表单数据项
    httplib::MultipartFormData item;
    item.name = "file";  // 表单项的名称
    item.filename = "hello.text";  // 文件名
    item.content = "hello world";  // 文件内容
    item.content_type = "text/plain";  // 文件内容类型

    // 创建一个多部分表单数据项列表,并将上面创建的表单项添加到列表中
    httplib::MultipartFormDataItems items;
    items.push_back(item);

    // 向服务器发送 POST 请求,提交多部分表单数据
    auto res = client.Post("/multipart", items);

    // 输出服务器响应的状态码和响应体
    cout << res->status << endl;  // 打印响应状态码
    cout << res->body << endl;    // 打印响应体内容
    
    return 0;
}

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

易宝OA getStockInRequestPrintDetail SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA getStockInRequestPrintDetail 接口处存在SQL注入漏洞,未经身份认证的攻击者…

Promise和async/await

Promise是异步编程的一种解决方案&#xff0c;用来解决多层回调嵌套的问题。它的构造函数是同步执行的&#xff0c;then 方法是异步执行的&#xff0c;所以创建后里面的函数会立即执行&#xff0c;构造函数中的resolve和reject只有第一次执行有效&#xff0c;也就是说Promise状…

随手集☞MySQL部分知识盘点(loading。。。)

字段类型 数值类型 INT: 整数类型&#xff0c;可以是正数或负数。根据显示宽度和是否有符号&#xff0c;其范围会有所不同。TINYINT: 非常小的整数。SMALLINT: 小的整数。MEDIUMINT: 中等大小的整数。BIGINT: 大整数。FLOAT: 单精度浮点数。DOUBLE: 双精度浮点数。DECIMAL(M,N…

Oracle的物理结构解析

这些图是我自己画的&#xff0c;我也会在我的公众号【会用数据库】解析。理解起来非常简单&#xff0c;而且非常好记。不用死记硬背&#xff0c;有兴趣可以来公众号看呀。

GitOps - 为 OpenShift GitOps 配置邮件通知

《OpenShift 4.x HOL教程汇总》 说明&#xff1a;本文已经 在OpenShift 4.15 OpenShift GitOps 1.11.2 环境中验证 文章目录 ArgoCD 的 Notification 功能简介启动 OpenShift GitOps 的 Notification 功能配置邮件通知验证参考 说明&#xff1a;先根据《OpenShift 4 之 GitOp…

Peter算法小课堂—树状数组

大家好&#xff0c;我是人见人爱&#xff0c;花见花开&#xff0c;车见车爆胎的树状数组Peter Pan&#xff0c;hhh 讲正文前&#xff0c;先来一个长文警告⚠很重要的知识点&#xff1a;L SB&#xff08;SB&#xff1f;&#xff09; LSB 怎么算呢&#xff1f; 哦……懂了&…

环形链表2--绝妙的运算

一、要求 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

静态路由协议实验综合实验

需求&#xff1a; 1、除R5的换回地址已固定外&#xff0c;整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口&#xff0c;用于模拟连接PC的网段&#xff1b;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

机器学习KNN最邻近分类算法

文章目录 1、KNN算法简介2、KNN算法实现2.1、调用scikit-learn库中KNN算法 3、使用scikit-learn库生成数据集3.1、自定义函数划分数据集3.2、使用scikit-learn库划分数据集 4、使用scikit-learn库对鸢尾花数据集进行分类5、什么是超参数5.1、实现寻找超参数5.2、使用scikit-lea…

【vite】

目录 vite介绍vite的基础应用vite创建项目vite创建vue3项目vite创建vue2项目vite创建react项目 vite中使用css的各种功能vite中使用ts vite介绍 一、特点&#xff1a; 开发时效率极高开箱即用&#xff0c;功能完备摄取丰富&#xff0c;兼容rollup超高速热重载预设应用和类库打…

vulhub中 Struts2-015 远程代码执行漏洞复现

影响版本: 2.0.0 - 2.3.14.2 ## 原理与测试 漏洞产生于配置了 Action 通配符 *&#xff0c;并将其作为动态值时&#xff0c;解析时会将其内容执行 OGNL 表达式&#xff0c;例如&#xff1a; xml <package name"S2-015" extends"struts-default"> …

上位机图像处理和嵌入式模块部署(qmacvisual之n点标定)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业场景中&#xff0c;很多时候图像是用来做测量的。虽然我们很希望载台是平的&#xff0c;摄像头是正对着拍摄物体的&#xff0c;但是运行时间长…

可视化图表:象形柱图,比柱图漂亮、有趣100倍。

一、什么是象形柱图 象形柱图&#xff08;Pictorial Bar Chart&#xff09;是一种可视化图表&#xff0c;它使用图形或图片代替传统的矩形柱子来表示数据。每个图形或图片的大小和形状都与对应的数据值相关联&#xff0c;从而形成一种视觉上的象征性表示。 象形柱图通常用于展…

【每日刷题】Day3

【每日刷题】Day3 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 2. 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 3. 118. 杨辉三…

STL容器(3)

1,stack容器 1.1 基本概念 概念&#xff1a;stack是一种先进后出的数据结构&#xff0c;它只有一个出口 因此&#xff1a; 栈中只有顶端的元素才可以被使用&#xff0c;因此占不允许有遍历行为 栈中进入数据称为--入栈&#xff08;push) 栈中弹出数据称为--出栈&#xff08…

【Linux】虚拟机连不上外网 (1),2024百度网络安全岗面试真题收录解析

vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTOstatic ONBOOTyes IPADDR? NETMASK? GATEWAY? dns18.8.8.8 dns1144.144.144.144 这两个必填 自我介绍一下&#xff0c;小编13年上海交大毕业&#xff0c;曾经在小公司待过&#xff0c;也去过华为、OPPO等大厂…

深入理解Armv9 DSU-110中的L3 cache

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 关键词&#xff1a; DynamIQ cluster、DSU-110、DSU-120、DSU、cache、mmu、缓存、高速缓存、内存管理、MPAM 思考&#xff1a; 1、L1、L2、L3 cache的替换策略是怎样的&#xff…

Android中的aidl接口及案例说明

目录 一、什么是AIDL 二、AIDL语法规格 三、AIDL实例 客户端: 服务端: 一、什么是AIDL AIDL,即 Android Interface Definition Language,用于android不同进程间通信接口。同一个应用里面还是建议用正常接口实现功能即可。 官方说明:Android 接口定义语言 (AIDL) | …

如何使用屏幕变式控制SAP系统操作界面字段的必输、显示或隐藏

在SAP/ERP项目实施中经常会遇到要求把SAP系统操作的界面中某些字段设置为必输&#xff0c;显示或隐藏&#xff0c;遇到这种需求时&#xff0c;有些业务操作界面可以通过后台进行屏幕的字段状态设置解决&#xff0c;而有些业务的操作界面是没有屏幕字段的后台设置的&#xff0c;…

DSP实时计算平台设计方案:912-基于6U CPCIe的双路光纤图像DSP实时计算平台

基于6U CPCIe的双路光纤图像DSP实时计算平台 一、设备概述 设备基于6U CPCIe架构&#xff0c;通过背板交换实现4片信号处理板卡的互联传输&#xff0c;每个信号处理板卡支持双TMS320C6678&#xff0c;支持2路光纤的图像处理&#xff0c;实现FPGA的预处理和备份工…