【QT进阶】Qt http编程之用户登录注册功能实现

news/2024/9/24 2:51:03/

往期回顾

【QT进阶】Qt http编程之http与https简单介绍-CSDN博客

【QT进阶】Qt http编程之后端API测试工具postman使用介绍-CSDN博客

【QT进阶】Qt http编程之http相关类的简单介绍-CSDN博客

 【QT进阶】Qt http编程之用户登录注册功能实现

一、最终效果展示

重点在逻辑实现,界面美化就先没弄

由于我没有启动相应接口,所以肯定是拿不到数据的,点击登录的结果就是请求超时,如果做了接口能拿到,就是直接展示获取的json格式数据

 二、后端逻辑实现

主要是看看如何使用 Qt 的网络模块发送 HTTP POST请求,并添加超时处理的逻辑,以确保及时处理网络请求的超时情况。

1、思路

整体思路很清晰:点击登录按钮后执行槽函数,槽函数里执行发送http、post请求的函数,在该函数里设置各类需要的信息并发送post请求,然后调用函数执行post请求完成后的响应,获取请求状态码看是成功了还是失败了,弹出对应消息提示框即可

2、具体实现分析

2.1点击登录按钮后执行槽函数

点击登录按钮后执行槽函数,槽函数里执行发送http、post请求的函数,这里写了两个函数,考虑到的是是否超时,超时就执行另一个函数处理

//处理登录按钮点击事件
void login_register::on_btnLogin_clicked() 
{//执行发送 HTTP POST 请求的函数//test_http_post();  //发送 HTTP POST 请求test_timeout_http_post();  //发送 HTTP POST 超时请求
}
2.2设置信息执行post请求和响应

在发送http、post请求的函数里设置各类需要的信息并发送post请求,然后调用函数执行post请求完成后的响应

//发送 HTTP POST 请求
void login_register::test_http_post()
{//创建一个 QNetworkAccessManager 对象,用于发送网络请求。QNetworkAccessManager* pHttpMgr = new QNetworkAccessManager();// 设置urlQString url = "http://127.0.0.1:8080/login";// 设置头信息QNetworkRequest requestInfo;requestInfo.setUrl(QUrl(url));requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));// setRawData//就没有去获取用户输入,而是直接给默认的账户密码值QJsonObject rawJson;rawJson.insert("username", "zhangsan");rawJson.insert("password", "123456");//设置为json格式数据QByteArray byte_array = QJsonDocument(rawJson).toJson();// 发送post请求QNetworkReply* reply = pHttpMgr->post(requestInfo, byte_array);if (reply){// 添加事件循环机制,请求完成时调用 post_requestFinished 函数处理响应,返回后再运行后面的connect(pHttpMgr, &QNetworkAccessManager::finished, this, &login_register::post_requestFinished);}
}
2.3、获取请求结果并弹出消息提示框

然后调用函数执行post请求完成后的响应,获取请求状态码看是成功了还是失败了,弹出对应消息提示框

//处理 POST 请求完成后的响应。
void login_register::post_requestFinished(QNetworkReply* reply) 
{// 通过reply对象的 attribute 方法获取 HTTP 状态码,并将其存储在 QVariant 类型的变量statusCode。QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//如果状态码有效,则输出状态码的整数值到调试输出。if (statusCode.isValid())qDebug() << "status code=" << statusCode.toInt();//通过reply对象的 attribute 方法获取 HTTP 状态码的原因,并将其存储在 QVariant 类型的变量 reason。QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();//如果原因有效,则输出原因的字符串值到调试输出。if (reason.isValid())qDebug() << "reason=" << reason.toString();//获取 QNetworkReply 对象的错误状态。QNetworkReply::NetworkError err = reply->error();//如果错误状态不是 NoError,表示请求失败,进入错误处理逻辑。if (err != QNetworkReply::NoError) {// 请求失败//再次获取 HTTP 状态码,用于显示错误信息。QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//弹出消息框,显示请求失败的信息,包括状态码和错误信息。QMessageBox::information(this, "warn","http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());return;}else {// 请求成功,进入成功处理逻辑。// 接收请求结果//读取响应数据,并存储在 QByteArray 类型的变量 responseByte 中。QByteArray responseByte = reply->readAll();QString strRes = responseByte; //将响应数据转换为字符串类型。//弹出消息框,显示请求成功的信息,包括响应数据。QMessageBox::information(this, "http post success","post response = " + strRes);}
}
 2.4超时请求处理函数

超时请求处理函数的大部分逻辑都是一样的,主要是发送请求后,添加了一个超时处理

注释写的还算清楚,大家可以多看看

//测试超时的 HTTP POST 请求。
void login_register::test_timeout_http_post()
{QNetworkAccessManager* pHttpMgr = new QNetworkAccessManager();// 设置urlQString url = "http://127.0.0.1:8080/login";// 设置头信息QNetworkRequest requestInfo;requestInfo.setUrl(QUrl(url));requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));// setRawDataQJsonObject rawJson;rawJson.insert("username", "zhangsan");rawJson.insert("password", "123456");QByteArray byte_array = QJsonDocument(rawJson).toJson();// 发送post请求QNetworkReply* reply = pHttpMgr->post(requestInfo, byte_array);
// 添加超时处理,1ms超时QEventLoop eventloop;connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));// 比如设置1ms内完成请求,否则就认为是超时//设置 1 秒后退出事件循环,模拟超时。QTimer::singleShot(1000, &eventloop, &QEventLoop::quit);eventloop.exec();QByteArray array;if (reply->isFinished()){if (reply->error() == QNetworkReply::NoError){//正常结束,读取响应数据QByteArray result = reply->readAll();QString strRes = result;QMessageBox::information(this, "http post success","post response = " + strRes);}else{// 异常结束// 请求失败QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);QMessageBox::information(this, "warn","http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());return;}}else{// 请求超时disconnect(reply, &QNetworkReply::finished, &eventloop, &QEventLoop::quit);reply->abort();QMessageBox::information(this, "http post timeout", "http post timeout");}reply->deleteLater(); //释放资源

以上就是如何使用Qt的网络模块发送HTTP、POST请求,并添加了超时处理的逻辑,以确保及时处理网络请求的超时情况的简单介绍

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!


http://www.ppmy.cn/news/1429158.html

相关文章

一文了解OCI标准、runC、docker、contianerd、CRI的关系

docker和contanerd都是流行的容器运行时&#xff08;container runtime&#xff09;&#xff1b;想讲清楚他们两之间的关系&#xff0c;让我们先从runC和OCI规范说起。 一、OCI标准和runC 1、OCI&#xff08;open container initiative&#xff09; OCI是容器标准化组织为了…

用Qt+NetCDF 读取NC文件

用QtNetCDF 读取NC文件_ivqtnc-CSDN博客 基于NetCDF-CXX4 封装&#xff0c;对NC文件进行读取&#xff0c;读取内存放到vector中。 ncBase.h #ifndef __NC_BASE_H__ #define __NC_BASE_H__#include <QVariant> #include <vector> #include <map> using na…

【Linux】系统安全及应用

目录 一、账号安全基本措施 1.系统账号清理 2.密码安全控制 3.历史命令安全管理 4.限制su切换用户 1&#xff09;将信任的用户加入到wheel组中 2&#xff09;修改su的PAM认证配置文件 5.ssh远程登录输入三次密码错误则锁定用户 二、Linux中的PAM安全认证 1.su命令的…

mfc140.dll丢失如何修复,分享多种有效的修复方法

在日常操作和使用电脑的过程中&#xff0c;我们可能会遇到一种较为常见的问题&#xff0c;即在尝试启动或运行某个应用程序时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出“mfc140.dll文件丢失”。这个mfc140.dll实际上是一个动态链接库文件&#xff08;DLL&…

虚幻引擎源码版安装下载,点击GenerateProjectFiles.bat报错 error NU1101NuGet包问题解决参考方案

开发环境配置与源码安装使用 安装VS2022 按照官方文档安装需要的vs配置 虚幻引擎源代码下载 Epic里面下载的引擎与源代码引擎区别&#xff1a;Epic里面下载的引擎是已经编译过的它的源代码访问权限不完整&#xff0c;源代码版本提供比较完整引擎代码&#xff0c;并且可以修…

【iOS安全】iOS ARM汇编

mov指令 MOV X22, X0 将X0的值移到X22中 参数传递 参数1&#xff1a;寄存器X0传递 参数2&#xff1a;寄存器X1传递 参数3&#xff1a;寄存器X2传递 参数4&#xff1a;寄存器X3传递 &#xff08;这里的X0传递的就是第一个实际参数&#xff0c;而不是self、selector之类的&…

mac tcp实现客户端与服务端进行图像传输及处理

客户端发送图像到服务端&#xff0c;服务端对图像进行处理&#xff0c;在将处理后的图像发送到客户端&#xff0c;并且服务端持续监听客户端。 客户端 #include <iostream> #include <fstream> #include <vector> #include <unistd.h> #include <…

Jackson知识点记录

文章目录 一.Jackson模块说明 二.ObjectMapper基本功能使用ObjectMapper的一些核心方法&#xff1a;示例代码1. 序列化示例2. 反序列化示例3. JsonNode 处理示例 高级配置 三.各种Node1. ObjectNode2. ArrayNode3. ValueNode4. MissingNode示例 一.Jackson Jackson 库主要分为…