Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式
void CHTTPTest::request(const std::any & data)
{// data 是从前端拿到的数据void *obj = std::any_cast<void *>(data); // std::any是C++17新标准的struct evhttp_request *req = (evhttp_request*)(obj);enum evhttp_cmd_type method = evhttp_request_get_command(req); // 获取请求方法if (method == EVHTTP_REQ_GET){// GET 请求this->getProcess(req);}else if (method == EVHTTP_REQ_POST){// POST 请求this->postProcess(req);}else{// 错误this->return_msg(req, "Unsupported request method.", ErrorCode::fail);}
}
GET的请求处理,包括前端请求的参数
void CHTTPTest::getProcess(evhttp_request * req)
{//获取请求uriconst char* uri = evhttp_request_get_uri(req);//解码uristruct evhttp_uri* decoded_uri = evhttp_uri_parse(uri);if (!decoded_uri){return_msg(req, "Failed to parse URI\n", ErrorCode::fail);return;}// 找到路径QString path = evhttp_uri_get_path(decoded_uri);if (path.isEmpty()){path = "/";}//解析查询字符串struct evkeyvalq params;evhttp_parse_query(uri, ¶ms);struct evkeyval* kv;// 创建 QVariantHash 用于存储参数//QVariantHash paramList;// 创建 JSON 对象用于存储查询参数QJsonObject jsonObj;// 遍历查询参数,将其添加到 JSON 对象中for (kv = params.tqh_first; kv; kv = kv->next.tqe_next){jsonObj[kv->key] = kv->value;}// 清理查询参数的内存evhttp_clear_headers(¶ms);// 创建 JSON 文档QJsonDocument JsonDoc = QJsonDocument(jsonObj);// 检查 JSON 对象是否为空,返回相应的消息QString Info = JsonDoc.toJson(QJsonDocument::Compact);// 将 JSON 文档转换为字符串并使用紧凑格式if (jsonObj.isEmpty()){return_msg(req, "Param Is Empty\n", ErrorCode::fail);return;}else{// 逻辑处理接口this->logicProcess(req, path, jsonObj);}
}
POST的请求处理,包括前端发送的参数处理
void CHTTPTest::postProcess(evhttp_request * req)
{const char* uri = evhttp_request_get_uri(req);struct evhttp_uri* decoded_uri = evhttp_uri_parse(uri);if (!decoded_uri){printf("Failed to parse URI\n");return;}QString path = evhttp_uri_get_path(decoded_uri);if (path.isEmpty()){path = "/";}struct evbuffer* input_buf = evhttp_request_get_input_buffer(req);size_t data_len = evbuffer_get_length(input_buf);char* data = (char*)malloc(data_len + 1);if (data){evbuffer_copyout(input_buf, data, data_len);data[data_len] = '\0';QJsonParseError parseError;QJsonDocument doc = QJsonDocument::fromJson(data, &parseError);if (parseError.error != QJsonParseError::NoError){this->return_msg(req, parseError.errorString(), ErrorCode::fail);return;}QJsonObject jsonObj = doc.object();// 逻辑处理接口this->logicProcess(req, path, jsonObj);}
}
内部消息返回前端的处理
void CDigitalModelManage::return_msg(evhttp_request * req, QString msg, int errCode)
{struct evbuffer* buf = evbuffer_new();if (!buf){return;}QJsonParseError parseError;QJsonDocument jsonDoc = QJsonDocument::fromJson(msg.toUtf8(), &parseError);QJsonObject jsonObject;QJsonDocument backJsonDoc;if (parseError.error == QJsonParseError::NoError){jsonObject = jsonDoc.object();jsonObject["code"] = errCode;}else{jsonObject["code"] = errCode;jsonObject["message"] = msg;}backJsonDoc = QJsonDocument(jsonObject);QString backInfo = backJsonDoc.toJson(QJsonDocument::Compact); evbuffer_add_printf(buf, backInfo.toUtf8().constData());evhttp_add_header(req->output_headers, "Content-Type", "application/json; charset=utf-8");evhttp_send_reply(req, HTTP_OK, "OK", buf);evbuffer_free(buf);
}
在接口logicProcess
中处理就是各个消息的内部逻辑处理了,传的第一个参数是http请求的内存块(我是这么理解的),第二个参数是和前端约定的URL,第三个参数就是前端发送的JSON体。只需要在接口logicProcess
中解这个JSON体就可以拿到值了。
这里只是一部分代码,比如怎么调用request
接口还需要研究研究,只是作为记录,方便后续学习参考。
相关文章:
Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...
Vue3 v-if与v-show的区别
v-if 与 v-show 我们都可以在开发中用于条件渲染,在面试时也是个常考的题目 实现原理 v-if:是真正的条件渲染,当v-if true时,元素会被创建、渲染,并插入到dom树中,这个过程会耗费系统的资源,当…...
同时在github和gitee配置密钥
同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥(默认文件路径为 ~/.ssh/github_id_rsa) ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...
Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解
Scala集合概述-链接 大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣 在 Scala 中,数组是一种特殊的集合类型,可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中,不可变…...
Failed to find SV in PRN block of SINEX file (Name svnav.dat)
gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables,即可。...
H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...
Ubuntu上使用自带python创建虚拟环境
虚拟环境让项目之间的依赖关系更加清晰,也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的,查看python版本及指向(使用的话python要换成python3): ls -l /usr/bin | grep python 2.安装python虚拟环境工…...
对智能电视直播App的恶意监控
首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者,这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团,阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...
网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...
微软企业邮箱:安全可靠的企业级邮件服务!
微软企业邮箱的设置步骤?如何注册使用烽火域名邮箱? 微软企业邮箱作为一款专为企业设计的邮件服务,不仅提供了高效便捷的通信工具,更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...
matlab导出3D彩色模型(surface类转stl,并对白模上色)
在matlab中绘制3维图形时,需要将3维图形导出到PPT中展示。但是直接导出图片效果欠佳,无法全方位展示。 最近学习了如何将matlab中的图形导出为stl模型,然后再采用简单的方法对模型上色。 中间尝试过matlab导出stl、ply、3dm等多种格式&…...
【JavaScript】async /await异步详解2 promise举例
在 JavaScript 中,async 和 await 是处理异步操作的强大工具。结合 try...catch 语句,你可以优雅地处理异步操作中的错误。 基本用法 定义异步函数:使用 async 关键字。等待 Promise 解析:使用 await 关键字。错误处理ÿ…...
Android 设备使用 Wireshark 工具进行网络抓包
背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…...
封装类与封装函数
目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点:模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景,适合快速开发和维护。 优 可维护性&…...
【java】接口幂等性的实现
文章目录 1. 引言介绍幂等性的概念为什么需要在Java接口中实现幂等性 2. 使用幂等表实现幂等性什么是幂等表如何设计幂等表示例:Java代码实现使用幂等表使用幂等表实现幂等性 3. 利用Nginx Lua 和 Redis实现幂等性Nginx和Lua的作用简介介绍Redis的SETNX命令架构设计…...
Leetcode 1.两数之和
题目意在对数组的快速查找 思路:哈希表 先创建一个哈希表,然后对数组进行遍历,iter代表用目标值依次减去遍历数组中的元素后得出的值,如果这个值在map中存在,则返回其索引和当前数组元素中的索引;若不存…...
GitLab指定用户分配合并权限
进入项目 -》 Project Settings Repository -》展开 Protected branches -》 添加要保护的分支,设置角色 管理用户角色权限 查看到不同用户的角色,一般设置Developer只有Merger Request权限,Maintainer还有Merge审批权限 GitLab 中的权限…...
实战优化公司线上系统JVM:从基础到高级
引言 Java虚拟机(JVM)是Java语言的核心组件,它使得Java程序能够实现“一次编写,到处运行”的跨平台特性。在现代应用程序中,JVM的性能和稳定性直接影响到系统的整体表现。本文将深入探讨JVM的基础知识、基本特点、定义…...
实时数据开发 | 一文理解Flink窗口机制
窗口操作在流处理和批处理之间起到了桥梁的作用。 Flink引擎本质上是流式引擎,认为批处理是流处理的一个特例。因此,通过窗口将流数据划分为有限大小的集合,使得在这些有界的数据集上可以进行批处理风格的计算。 通过配置窗口的参数…...
【云原生系列】迁移云上需要考虑哪些问题
云计算已经成为现代企业架构中不可或缺的一部分。越来越多的公司正在将他们的应用、数据和基础设施迁移到云平台上,以便更好地应对快速变化的市场需求、提高运营效率并降低成本。然而,迁移到云端并不是一件轻松的事情。涉及到多个技术、业务和管理层面的…...
1、Three.js开端准备环境
准备工作 从 CDN 导入 1.安装 VSCode 2.安装 Node.js 3.查看Three.js最新版本 4.如何cdn引入: https://cdn.jsdelivr.net/npm/threev版本号/build/three.module.js 例如:https://cdn.jsdelivr.net/npm/threev0.170.0/build/three.module.js 我们需要…...
go 和java 编写方式的理解
1. go 推荐写流水账式的代码(非贬义),自己管自己。java喜欢封装各种接口供外部调用,让别人来管自己。 2. 因为协程的存在, go的变量作用域聚集在方法内部,即函数不可重入,而java线程的限制&…...
华为ENSP--BGP路由协议实验详解
项目背景 随着A公司网络规模的增长和新业务对互联网接入速度及稳定性需求的提升,公司决定升级其网络设施。为此,A公司向运营商B租用了两条线路以接入网络,旨在提高网络资源的利用率,并增强网络的安全性、稳定性和可靠性,从而为用户提供更优质的服务和体验 在这一背景下,正…...
LLM*:路径规划的大型语言模型增强增量启发式搜索
路径规划是机器人技术和自主导航中的一个基本科学问题,需要从起点到目的地推导出有效的路线,同时避开障碍物。A* 及其变体等传统算法能够确保路径有效性,但随着状态空间的增长,计算和内存效率会严重降低。相反,大型语言…...
UE5 MakeSlateBrush 节点的作用
在 Unreal Engine 5 (UE5) 中,MakeSlateBrush 节点是用于 创建或设置一个 Slate Brush 的节点。Slate 是 Unreal Engine 中的 UI 框架,用于构建编辑器界面以及游戏中的用户界面(UI)。Slate Brush 是 Slate UI 中的一种资源类型&am…...
机载视频流回传+编解码方案
无线网络,低带宽场景。不能直接转发ROS raw image(10MB/s),而要压缩(编码)后再传输。可以用rtsp的udp传输或者直接传输话题,压缩方法有theora(ROS image_transport默认支持ÿ…...
小程序 - 婚礼邀请函
小程序页面和样式练习 - 婚礼邀请函小程序开发笔记 目录 婚礼邀请函 准备工作 加载静态资源 项目初始化 标签栏的配置 各页面导航栏标题配置 全局导航栏样式配置 公共样式的编写 项目内容 邀请函页面内容 邀请函页面样式 照片页面内容 照片墙页面样式 美好时光页…...
命令行使用ssh隧道连接远程mysql
本地电脑A 跳板机B 主机2.2.2.2 用户名 B ssh端口号22 登录密码bbb 远程mysql C 地址 3.3.3.3 端口号3306 用户名C 密码ccc A需要通过跳板机B才能访问C; navicat中配置ssh可以实现在A电脑上访问C 如何实现本地代码中访问C呢? # 假设本地使…...
深度学习:完整的模型训练流程
深度学习:完整的模型训练流程 为了确保我们提供一个彻底和清晰的指导,让我们深入分析在model.py和train.py文件中定义的模型训练和验证流程。以下部分将详细讨论模型结构的定义、数据的加载与预处理、训练参数的配置、训练与测试循环,以及模…...
【数据结构】ArrayList与顺序表
ArrayList与顺序表 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 杨辉三角5.2 简单的洗牌算法 6. ArrayList的问题及思考 【本节目标】 线性表顺序表ArrayLis…...
如何使用 python 中 pandas 进行数据分析?
使用Python中的pandas进行数据分析主要有以下几个步骤: 导入pandas库和数据文件 首先需要导入pandas库和数据文件,可以使用pandas的read_csv()函数读取CSV格式的数据文件,并将其存储为DataFrame格式。 pythonCopy code import pandas as p…...
WordPress文章目录插件,LuckyWP Table of Contents自动生成文章插件
文章带目录不能帮助用户快速获取信息,也能让页面内容更具条例,更加符合搜索引擎收录规范。今天给大家推荐一款免费好用的WordPress文章目录插件LuckyWP Table of Contents。LuckyWP Table of Contents 是一个WordPress插件,它允许你在博客帖…...
Qwen2.5-7B大模型微调记录
Qwen2.5-7B大模型微调记录 研究需要,需要搞一个大模型出来,没有太多的时间自己训练,准备用现成的开源大模型,然后结合研究方向进行微调 前前后后折腾大半个月,总算做完了第一个微调的大模型,模型基于阿里…...
TCP三次握手和四次挥手
三次握手:表示这客户与服务器之间的连接确定。 第一次:由客户端发出连接请求到服务器,服务器收到后可以确定客户的发送与自身的接收没问题 第二次:再由服务器回话个客户,让客户知道自己的发送与接收没问题,这时服务器还不知自己的…...
[Maven]3.5.3配置
MAVEN本地仓库配置: 1.conf 2.settings.xml 3.找到本地仓库配置目录 4.填写路径 5.镜像仓库...
68000汇编实战01-编程基础
文章目录 简介产生背景应用领域 语言学习EASy68K帮助文档IDE使用 编程语言commentslabels开始标签指令标签位置标签 opcode 操作码常用操作码数据传送算术运算逻辑运算控制流分支跳转地址跳转子程序跳转 位操作比较堆栈操作 IO操作码其他操作码 directives 指令DC指令EQU 指令S…...
常见的概念 及 分布式系统的演变过程
文章目录 一. 概念解释1. 应用(Application)/ 系统(System)2. 模块(Module)/ 组件(Component)3. 分布式(Distributed)4. 集群(Cluster)…...
torch.is_nonzero(input)
torch.is_nonzero(input) input: 输入张量 若输入是 不等于零的单元素张量 则返回True,否则返回False 不等于零的单元素张量:torch.tensor([0.]) 或 torch.tensor([0]) 或 torch.tensor([False])单元素张量: 只有一个数 的张量 import torch print(t…...
爬虫开发(5)如何写一个CSDN热门榜爬虫小程序
笔者 綦枫Maple 的其他作品,欢迎点击查阅哦~: 📚Jmeter性能测试大全:Jmeter性能测试大全系列教程!持续更新中! 📚UI自动化测试系列: SeleniumJava自动化测试系列教程❤ 📚…...
Rust 组织管理
Rust 组织管理 Rust 是一种系统编程语言,以其安全性、并发性和性能而闻名。随着 Rust 社区的不断壮大,有效的组织管理变得至关重要。本文将探讨 Rust 社区的组织结构、项目管理、社区参与和未来发展方向。 Rust 社区的组织结构 Rust 社区采用了一种去中心化的组织结构。核…...
谈谈微服务的常用组件
由于微服务给系统开发带来了一些问题和挑战,如服务调用的复杂性、分布式事务的处理、服务的动态管理等,为了更好地解决这些问题和挑战,各种微服务治理的组件应运而生,充当微服务架构的基石和支撑,常用组件如下表&#…...
Android11.0默认壁纸缩放
获取壁纸缩放值的代码 //in com.android.server.wm.WallpaperController private final float mMaxWallpaperScale; //construct method WallpaperController(WindowManagerService service, DisplayContent displayContent) {......mMaxWallpaperScale service.mContext.ge…...
git 本地同步远端分支
一、关联远程仓库 本地仓库关联远端仓库 git remote add origin https://github.com/user/repository.git 二、获取远程分支信息 获取远程仓库的最新分支信息 git fetch origin 三、创建或切换到本地分支以跟踪远程分支 1. 创建分支 创建分支并关联到远端分支 git bra…...
数字IC后端设计实现之分段长clock tree经典案例
最近发现很多读者问到分段长clock tree的做法,小编今天给大家分享几个SoC芯片中复杂时钟结构设计的分段长clock tree的应用案例。希望对各位的学习和工作有所助益。 数字后端设计实现之时钟树综合实践篇 数字IC后端实现专家都具备哪些技能?(…...
矩阵重新排列——rot90函数
通过 r o t 90 rot90 rot90函数可以将矩阵进行旋转 用法: r o t 90 ( a , k ) rot90(a,k) rot90(a,k)将矩阵 a a a按逆时针方向旋转 k 9 0 ∘ k\times90^\circ k90∘...
深入解析音视频流媒体SIP协议交互过程
一、引言 在音视频流媒体传输过程中,SIP(Session Initiation Protocol)协议发挥着举足轻重的作用。本文将详细全面地介绍音视频流媒体传输中的SIP协议,包括其基本概念、交互过程、关键信令以及应用场景 二、SIP协议基本概念 1.…...
【C++】深入解析 cin 和 cout:理解区分输入输出流运算符
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯cin 和 cout 简介💯cin >> 与 cout << 的流运算符💯理解流运算符方向的四种方法1. 符号方向对应数据流动的方向2. 形象比喻3. 记住公式…...
java介绍
Java是一种广泛应用的高级编程语言,具有以下特点和应用场景: 语言特性 简单易学 Java语法相对简洁,去除了一些复杂的指针操作等,使得程序员能够更专注于业务逻辑的实现。例如,Java使用自动内存管理(垃圾回…...
1-深度学习干货总结(持续更新)
机器学习核心组件 可以用来学习的数据(data); 如何转换数据的模型(model); 一个目标函数(objective function),用来量化模型的有效性; 调整模型参数以优化…...
《C++搭建神经网络基石:开启智能编程新征程》
在人工智能的璀璨星空中,神经网络无疑是最为耀眼的星座之一。而 C以其卓越的性能和高效的执行效率,成为构建神经网络模型的有力武器。今天,就让我们一同探索如何使用 C构建一个基础的神经网络模型,踏上智能编程的奇妙旅程。 一、…...