• 【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请求的函数,这里写了两个函数,考虑到的是是否超时,超时就执行另一个函数处理

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

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

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

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

    1. //处理 POST 请求完成后的响应。
    2. void login_register::post_requestFinished(QNetworkReply* reply)
    3. {
    4. // 通过reply对象的 attribute 方法获取 HTTP 状态码,并将其存储在 QVariant 类型的变量statusCode。
    5. QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    6. //如果状态码有效,则输出状态码的整数值到调试输出。
    7. if (statusCode.isValid())
    8. qDebug() << "status code=" << statusCode.toInt();
    9. //通过reply对象的 attribute 方法获取 HTTP 状态码的原因,并将其存储在 QVariant 类型的变量 reason。
    10. QVariant reason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString();
    11. //如果原因有效,则输出原因的字符串值到调试输出。
    12. if (reason.isValid())
    13. qDebug() << "reason=" << reason.toString();
    14. //获取 QNetworkReply 对象的错误状态。
    15. QNetworkReply::NetworkError err = reply->error();
    16. //如果错误状态不是 NoError,表示请求失败,进入错误处理逻辑。
    17. if (err != QNetworkReply::NoError)
    18. {
    19. // 请求失败
    20. //再次获取 HTTP 状态码,用于显示错误信息。
    21. QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    22. //弹出消息框,显示请求失败的信息,包括状态码和错误信息。
    23. QMessageBox::information(this, "warn",
    24. "http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());
    25. return;
    26. }
    27. else
    28. {
    29. // 请求成功,进入成功处理逻辑。
    30. // 接收请求结果
    31. //读取响应数据,并存储在 QByteArray 类型的变量 responseByte 中。
    32. QByteArray responseByte = reply->readAll();
    33. QString strRes = responseByte; //将响应数据转换为字符串类型。
    34. //弹出消息框,显示请求成功的信息,包括响应数据。
    35. QMessageBox::information(this, "http post success",
    36. "post response = " + strRes);
    37. }
    38. }
     2.4超时请求处理函数

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

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

    1. //测试超时的 HTTP POST 请求。
    2. void login_register::test_timeout_http_post()
    3. {
    4. QNetworkAccessManager* pHttpMgr = new QNetworkAccessManager();
    5. // 设置url
    6. QString url = "http://127.0.0.1:8080/login";
    7. // 设置头信息
    8. QNetworkRequest requestInfo;
    9. requestInfo.setUrl(QUrl(url));
    10. requestInfo.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json"));
    11. // setRawData
    12. QJsonObject rawJson;
    13. rawJson.insert("username", "zhangsan");
    14. rawJson.insert("password", "123456");
    15. QByteArray byte_array = QJsonDocument(rawJson).toJson();
    16. // 发送post请求
    17. QNetworkReply* reply = pHttpMgr->post(requestInfo, byte_array);
    1. // 添加超时处理,1ms超时
    2. QEventLoop eventloop;
    3. connect(reply, SIGNAL(finished()), &eventloop, SLOT(quit()));
    4. // 比如设置1ms内完成请求,否则就认为是超时
    5. //设置 1 秒后退出事件循环,模拟超时。
    6. QTimer::singleShot(1000, &eventloop, &QEventLoop::quit);
    7. eventloop.exec();
    8. QByteArray array;
    9. if (reply->isFinished())
    10. {
    11. if (reply->error() == QNetworkReply::NoError)
    12. {
    13. //正常结束,读取响应数据
    14. QByteArray result = reply->readAll();
    15. QString strRes = result;
    16. QMessageBox::information(this, "http post success",
    17. "post response = " + strRes);
    18. }
    19. else
    20. {
    21. // 异常结束
    22. // 请求失败
    23. QVariant statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
    24. QMessageBox::information(this, "warn",
    25. "http post failed, error code = " + statusCode.toString() + " error info: " + reply->errorString());
    26. return;
    27. }
    28. }
    29. else
    30. {
    31. // 请求超时
    32. disconnect(reply, &QNetworkReply::finished, &eventloop, &QEventLoop::quit);
    33. reply->abort();
    34. QMessageBox::information(this, "http post timeout", "http post timeout");
    35. }
    36. reply->deleteLater(); //释放资源

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

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

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

  • 相关阅读:
    论文翻译:2020_DCCRN: Deep Complex Convolution Recurrent Network for Phase-Aware Speech Enhancement
    Spring/Spring MVC、Spring Boot/Spring Cloud
    touchGFX综合学习十三、基于cubeMX、正点原子H750开发版、RGB4.3寸屏移植touchGFX完整教程+工程(一)
    ConstraintLayout 你真的会用了吗
    flume安装及实战
    PA2019 Terytoria
    【STM32】入门(七):I2C硬件控制方式
    【pytest】 参数化@pytest.mark.parametrize
    网络编程socket相关错误号及信息的获取
    Python数据分析案例10——北向资金流入与沪深300涨跌幅分析
  • 原文地址:https://blog.csdn.net/LF__plus/article/details/138025720