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

往期回顾

【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.hqwc.cn/news/637810.html

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

相关文章

Linux基础和常见命令速览

来源&#xff1a;Linux 基础知识总结 | JavaGuide 一、Linux文件系统 1. 文件系统 Linux 系统中的一个重要的概念&#xff1a;一切都是文件。 在 Linux 操作系统中&#xff0c;一切被操作系统管理的资源&#xff0c;如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件…

三、Flask模型基础

ORM 创建模型 # exts.py&#xff1a;插件管理 # 扩展的第三方插件 # 1.导入第三方插件 from flask_sqlalchemy import SQLAlchemy # ORM插件 from flask_migrate import Migrate # 2. 初始化 db SQLAlchemy() # ORM migrate Migrate() # 数据迁移 # 3. 和app对象绑定 def…

【JVM常见问题总结】

文章目录 jvm介绍jvm内存模型jvm内存分配参数jvm堆中存储对象&#xff1a;对象在堆中创建分配内存过程 jvm 堆垃圾收集器垃圾回收算法标记阶段引用计数算法可达性分析算法 清除阶段标记清除算法复制算法标记压缩算法 实际jvm参数实战jvm调优jvm常用命令常用工具 jvm介绍 Java虚…

WebSocket 快速入门 - springboo聊天功能

目录 一、概述 1、HTTP&#xff08;超文本传输协议&#xff09; 2、轮询和长轮询 3、WebSocket 二、WebSocket快速使用 1、基于Java注解实现WebSocket服务器端 2、JS前端测试 三、WebSocket进阶使用 1、如何获取当前用户信息 2、 后端聊天功能实现 一、概述 HTTP…

C语言语法进阶

条件运算符 条件运算符是 C 语言中唯一的一种三目运算符。三目运算符代表有三个操作数&#xff1b;双目 运算符代表有两个操作数&#xff0c;如逻辑与运算符就是双目运算符&#xff1b;单目运算符代表有一个操作数&#xff0c; 如逻辑非运算符就是单目运算符。运算符也称操作符…

react之组件与JSX

第一章 - 描述用户界面 概述&#xff1a;React是一个用于构建用户界面&#xff08;UI&#xff09;的JavaScript库&#xff0c;用户界面由按钮&#xff0c;文本和图像等小单元内容构建而成。React帮助你把它们组合成可重用&#xff0c;可嵌套的组件。从web端网站到移动端应用&a…

基于Linux共享内存的数据分发DDS——C语言实现

基于共享内存的数据分发DDS——C语言实现 一、软件功能介绍 在linux环境下用C语言开发的基于共享内存的数据分发DDS软件。采用了共享内存、多线程、读写锁以及互斥锁实现。 软件支持功能如下&#xff1a; 内部采用共享内存进行数据传输&#xff0c;支持多进程、多线程的数据…

【信号处理】基于CNN的心电(ECG)信号分类典型方法实现(tensorflow)

关于 本实验使用1维卷积神经网络实现心电信号的5分类。由于数据类别不均衡&#xff0c;这里使用典型的上采样方法&#xff0c;实现数据类别的均衡化处理。 工具 方法实现 数据加载 Read the CSV file datasets: NORMAL_LABEL0 , ABNORMAL_LABEL1,2,3,4,5 ptbdb_abnormalpd.…

Python | Leetcode Python题解之第42题接雨水

题目&#xff1a; 题解&#xff1a; class Solution:def trap(self, height: List[int]) -> int:if not height:return 0n len(height)leftMax [height[0]] [0] * (n - 1)for i in range(1, n):leftMax[i] max(leftMax[i - 1], height[i])rightMax [0] * (n - 1) [he…

ROS机器人入门第七课:参数服务器

文章目录 ROS机器人入门第七课&#xff1a;参数服务器一、参数服务器介绍二、参数操作1.参数服务器新增(修改)参数2.参数服务器获取参数3.参数服务器删除参数 ROS机器人入门第七课&#xff1a;参数服务器 一、参数服务器介绍 参数服务器在ROS中主要用于实现不同节点之间的数据…

ubuntu安装QEMU

qemu虚拟机的使用&#xff08;一&#xff09;——ubuntu20.4安装QEMU_ubuntu安装qemu-CSDN博客 遇到的问题&#xff1a; (1)本来使用git clone https://github.com/qemu/qemu.git fatal: 无法访问 https://github.com/qemu/qemu.git/&#xff1a;GnuTLS recv error (-110): …

李宏毅2022机器学习/深度学习 个人笔记(2)

本系列用于推导、记录该系列视频中本人不熟悉、或认为有价值的知识点 本篇记录第一讲&#xff08;选修&#xff09;&#xff1a;神奇宝贝分类&#xff08;续&#xff09; 讲解如何用高斯概率分布假设来推导类似于逻辑斯蒂分布的表达式 如图&#xff0c;boundary变为直线&…