QT聊天项目DAY06

1.从git上同步项目

编译测试,编译通过

Post请求测试

测试成功

2. email is 打印有问题,检查

解析结果是存储在jsonResult中的,修改

3. 客户端实现Post验证码请求

3.1 同步Qt客户端项目

检查QT版本,由于我在公司用的还是QT5.12.9,现在下一版5.14.2

https://download.qt.io/archive/qt/5.14/

选择一下安装目录

选择编译器版本,不适用MingW因为打包容易产生库的依赖缺失问题

3.2 配置系统环境

1. 右击此电脑

2. 新增VSQT扩展编辑器版本

3. 编译测试

图片丢失,检查

但是用QT5.12.9 就没有问题

可能是安装的时候缺失了什么吧

添加QTDesigner打开UI界面,看看是哪里出问题了

检查了一遍UI发现没有任何问题,重新编译查看,一切正常

VS必须要自己配置打开UI的启动器喔,如果不自己配置的话,容易打不开UI界面还可能只能打开代码界面,或者一打开UI就闪退,配置.ui文件的打开方式,上面以及介绍了喔

3.3 开始实现Post请求,然后获取服务器发来的验证码

如果邮箱格式正确就发送Http请求

/* 获取验证码 */
void RegisterWidget::OnGetCodeButtonClicked()
{QString Email = ui.Email_Edit->text();// 设置正则表达式QRegularExpression Regex(R"(^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)");bool Match = Regex.match(Email).hasMatch();/* 如果邮箱格式正确 */ if (Match){// 发送Http验证码QJsonObject jsonHttpCode;jsonHttpCode.insert("email", Email);HttpManager::Instance()->PostHttpReq(QUrl("http://localhsot:8080//getVarifycode"),jsonHttpCode,ReqID::ID_GET_VARIFY_CODE,Modules::REGISTERMOD);}else{ShowTipLabel(QString::fromLocal8Bit("邮箱格式不正确"), "error");}
}

报错了,QNetworkReply::UnknownServerError,拼写错误,是host不是hsot

一切正确

4. Post请求的整体梳理

4.1 当获取验证码按钮点击时

触发该按钮对应的回调函数,在回调里会先获取邮箱文本,如果邮箱格式正确,会设置要发送的请求,即设置json

4.2 Http管理请求的对象发送该请求

1. 就是之前说过的,当服务器监听8080端口号时发现有客户端发来连接时,会分配一个socket套接字来管理该链接,然后继续监听8080端口;

这里对应的就是客户端发来连接请求,还有对应的请求体request

QNetworkReply* reply = m_pNetworkAccessManager->post(request, data);						
// 发送请求返回一个管理该连接的对象,如果服务器为该连接分配了套接字

2. 服务器会检查是否是Post请求

至于如何解析Post请求的在前面的文章说过了,这里不再赘述,如果客户端发来的json中有email这个key,说明解析成功了,然后回送响应

3. 客户端解析服务器发来的响应

这里只是将服务器回送的响应从客户端的接受缓冲区中全部读出来,并填充到QString中了

具体的解析行为还是在注册窗口里,解耦了,看课的代码很多自己都记不下来,没关系,重要的是掌握思想和整体脉络,只要熟悉一遍了,自己再去搭服务器框架的时候,再猜猜坑,有些代码背不住直接问AI让他帮你生成就可以了

在获取验证码的回调函数中,会检查该回应是否成功

这个error key 是在服务器中添加到响应中的_response["error"]  = 0,这里修改一下魔法数字

最后就是获取服务器响应报文中的email

至此整个客户端向服务器发送Post请求的一整套逻辑已经跑了一遍,老实说,这套代码让我再敲一遍,我也敲不出来这么完整的框架出来,这也说明了弯路才是捷径

5. 用Config文件来管理客户端的参数

1. 新建Confin.ini,并添加现有项到自己的解决方案中

2. 填充Config.ini

[GateServer]
host=localhost
port=8080
target=getVarifycode

3. 读取Config.ini 

根据我的开发经验来说

一般直接用QDir::CurrPath + Config/Config.ini

或者“./Config/Config.ini”

目前来说没出现过报错

#ifndef GLOBAL_H
#define GLOBAL_H
#include <QWidget>
#include <functional>
#include <QRegularExpression>
#include "QStyle"#include <memory>
#include <iostream>
#include <mutex>#include <QString>// extern 声明此变量是在其他文件中定义的全局变量
extern std::function<void(QWidget*)> repolish;extern QString ConfigPath;								// 配置文件路径#endif // GLOBAL_H
#include "Global.h"#include <QDir>// 初始化声明的全局变量
std::function<void(QWidget*)> repolish = [](QWidget* Widget)
{Widget->style()->unpolish(Widget);Widget->style()->polish(Widget);
};// 配置文件路径
QString ConfigPath = QDir::currentPath() + "/Config/Config.ini";

4. 用QSetting来管理这个config.ini

5. 重新定义创建URL的方式为读取config的方式,来拼接URL

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

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

相关文章

PHP腾讯云人脸核身获取FaceId

参考腾讯云官方文档&#xff1a; 人脸核身 合作方后台上传身份信息_腾讯云 前提&#xff1a;已经获取了SIGN Ticket。获取参考文档&#xff1a; PHP腾讯云人脸核身获取SIGN Ticket-CSDN博客 public function getTxFaceId($uid,$name,$idNo){$appId ;$userId $uid;$nonce …

用 Deepseek 写的uniapp油耗计算器

下面是一个基于 Uniapp 的油耗计算器实现&#xff0c;包含 Vue 组件和页面代码。 1. 创建页面文件 在 pages 目录下创建 fuel-calculator 页面&#xff1a; <!-- pages/fuel-calculator/fuel-calculator.vue --> <template><view class"container"…

Redis ④-通用命令

Redis 是一个 客户端-服务器 结构的程序&#xff0c;这与 MySQL 是类似的&#xff0c;这点需要牢记&#xff01;&#xff01;&#xff01; Redis 固然好&#xff0c;但也不是任何场景都适合使用 Redis&#xff0c;一定要根据当前的业务需求来选择是否使用 Redis Redis 通用命令…

HarmonyOs学习 环境配置后 实验1:创建项目Hello World

HarmonyOS开发入门&#xff1a;环境配置与Hello World实验 实验目标 掌握HarmonyOS开发环境配置&#xff0c;创建首个HarmonyOS应用并实现"Hello World"界面展示 实验准备 已安装DevEco Studio开发环境已配置HarmonyOS开发依赖项熟悉基本TypeScript/ArkTS语法&am…

HTTP:十.cookie机制

Cookie概念及类型 HTTP cookie,简称cookie,又称数码存根、“网站/浏览+魔饼/魔片”等,是浏览网站时由网络服务器创建并由网页浏览器存放在用户计算机或其他设备的小文本文件。Cookie使Web服务器能在用户的设备存储状态信息(如添加到在线商店购物车中的商品)或跟踪用户…

记录小程序第一次调用Api,基于腾讯云Serverless函数,实现小程序的成功接入api,以及数据调用

目录 创建腾讯云个人账户新建severless应用建立函数URL小程序中调用api示例 创建腾讯云个人账户 百度搜索即可&#xff0c;并注册 新建severless应用 作者以github下载的某Api为例&#xff0c;这里不展示具体Api&#xff0c;只关注操作即可&#xff0c;相信都是互通的 在腾…

ES6 第一讲 变量定义 堆与栈 字符串的扩展和数值型的扩展

文章目录 1.ES6变量定义2.ES6堆和栈3.字符串的扩展3.1 模板字符串3.2 判断是否以指定的字符串开头或结尾3.3 字符串重复输出3.4 填充方法3.5 去除前后字符串空格3.6 返回参数指定位置的字符 4. 数值型的扩展4.1 二进制0B 八进制0O4.2 判断是否是一个无穷大的数字 &#xff08;判…

LeetCode第158题_用Read4读取N个字符 II

LeetCode 第158题&#xff1a;用Read4读取N个字符 II 题目描述 给你一个文件&#xff0c;并且该文件只能通过给定的 read4 方法来读取&#xff0c;请实现一个方法来读取 n 个字符。 read4 方法&#xff1a; API read4 可以从文件中读取 4 个连续的字符&#xff0c;并且将它…

算法篇之单调栈

单调栈算法入门 单调栈是一种特殊的数据结构应用&#xff0c;它的核心在于维护一个栈&#xff0c;使得栈内元素保持单调递增或者单调递减的顺序。这种数据结构在解决很多算法问题时非常有效&#xff0c;例如求数组中每个元素的下一个更大元素、每日温度问题等。 一、单调栈的…

Kubernetes控制平面组件:调度器Scheduler(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes架构原则和对象设计&#xff08;二&#xff09;Kubernetes架构原则和对象设计&#xff08;三&#xff09;Kubernetes控…

【网络】数据链路层知识梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 数据链路层 我们来重新理解一下这个图&#xff1a;…

机器学习(神经网络基础篇)——个人理解篇6(概念+代码)

1 在声明一个类中&#xff0c;构建一个属于类的函数&#xff0c;前面为什要加上“self”&#xff1f; 就像下面这一串代码&#xff1a; class TwoLayerNet:def __init__(self, input_size, hidden_size, output_size,weight_init_std0.01):# 初始化权重self.params {}self.p…

Cribl 对Windows-xml log 进行 -Removing filed-06

Removing Fields Description​ The Eval Function can be used to add or remove fields. In this example we will remove the extracted fields while preserving _raw, _time,index,source, sourcetype. Steps - Adding an Eval Function

chili3d调试6 添加左侧面板

注释前 一个一个注释看对应哪个窗口 无事发生 子方法不是显示的窗口 注释掉看看 没了 注释这个看看 零件页面没了 这个浏览器居然完全不用关的&#xff0c;刷新就重载了 注释看看 无工具栏版本 sidebar&#xff1a; 往框框里面加入 div({ className: style.input }, user_…

Linux学习——了解和熟悉Linux系统的远程终端登录

Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare&#xff0c;选择编辑虚拟机设置&#xff0c;在网络适配器设置中&#xff0c;选择“桥接模式”&#xff0c;保存设置并启动Ubuntu。 2、配置Ubuntu的…

【JAVA EE初阶】多线程(1)

这样的代码&#xff0c;虽然也能打印hello thread&#xff0c;但是没有创建新的线程&#xff0c;而是直接在main方法所在的主线程中执行了run的逻辑 start方法&#xff0c;是调用系统api&#xff0c;真正在操作系统内部创建一个线程。这个新的线程会以run作为入口方法&#xff…

javase 学习

一、Java 三大版本 javaSE 标准版 &#xff08;桌面程序&#xff1b; 控制台开发&#xff09; javaME 嵌入式开发&#xff08;手机、小家电&#xff09;基本不用&#xff0c;已经淘汰了 javaEE E业级发开&#xff08;web端、 服务器开发&#xff09; 二、Jdk ,jre jvm 三…

【Linux】Linux 操作系统 - 05 , 软件包管理器和 vim 编辑器的使用 !

文章目录 前言一、软件包管理器1 . 软件安装2 . 包管理器3 . Linux 生态 二、软件安装 、卸载三、vim 的使用1 . 什么是 vim ?2 . vim 多模式3 . 命令模式 - 命令4 . 底行模式 - 命令5. 插入模式6 . 替换模式7 . V-BLOCK 模式8 . 技巧补充 总结 前言 本篇笔者将会对软件包管理…

python基础知识点(1)

python语句 一行写一条语句 一行内写多行语句&#xff0c;使用分号分隔建议每行写一句&#xff0c;且结束时不写分号写在[ ]、{ }内的跨行语句&#xff0c;被视为一行语句\ 是续行符,实现分行书写功能 反斜杠表示下一行和本行是同一行 代码块与缩进 代码块复合语句&#xf…

C#/.NET/.NET Core技术前沿周刊 | 第 35 期(2025年4.14-4.20)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…