QT HTTP通信--学习笔记1

需要添加的头文件

//.pro
QT += network

//头文件
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>

GET请求的实现

代码如下,详细解释看注释。请求完成后有两种方式拿到请求结果(或者说请求结束后的需要进行的动作)。已知QNetworkReply::finished为请求完成时发出的信号,一是:使用信号槽的机制来进行请求后所需要的动作;二是:使用QEventLoop事件循环等待请求事件结束后,再进行所需的动作。

/** 第一种方法,这里的槽函数使用拉姆达表达式 */    
    // 目标网址
    QUrl url("http://www.test.com");
    // 创建网络请求
    QNetworkRequest request;
    request.setUrl(url);
    // 创建网络访问管理器
    QNetworkAccessManager manager;

    // 创建请求响应对象 并发起GET请求
    QNetworkReply *reply = manager.get(request);
    
    // 连接信号,当响应准备好时,读取数据
    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        if (reply->error() == QNetworkReply::NoError) {
            // 读取响应数据
            QByteArray responseData = reply->readAll();
            QString htmlContent = QString::fromUtf8(responseData);

            // 输出内容
            qDebug() << "内容:" << htmlContent;
        } else {
            // 输出错误信息
            qDebug() << "发生错误:" << reply->errorString();
        }

        // 清理资源
        reply->deleteLater();
    });
/** 第二种方法,使用QEventLoop等待请求完成 */
    // 目标网址
    QUrl url("http://www.test.com");
    // 创建网络请求
    QNetworkRequest request;
    request.setUrl(url);
    // 创建网络访问管理器
    QNetworkAccessManager manager;

    // 创建请求响应对象 并发起GET请求
    QNetworkReply *reply = manager.get(request);
    
    // 创建事件循环,等待请求完成
    QEventLoop loop;
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();

        // 检查请求是否成功
    if (reply->error() == QNetworkReply::NoError) {
        // 读取请求结果
        QByteArray responseData = reply->readAll();
        QString responseStr = responseData;
        // 处理请求结果
        qDebug() << "HTTP GET请求成功,返回数据:" << responseStr;
    } else {
        // 处理错误
        qDebug() << "HTTP GET请求失败:" << reply->errorString();
    }

    // 释放资源
    reply->deleteLater();

POST请求的实现

也是可以使用这两种方案,但是这里是只延时使用QEventLoop的方案,原理都差不多。

    // 目标网址
    QUrl url("http://www.test.com");
    // 创建网络请求
    QNetworkRequest request;
    request.setUrl(url);
    /** 下面请求头和请求数据都是有需要添加,有的网址也可以不添加,根据实际情况来决定 */
//    // 设置请求头
//    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json, text/plain, */*");
//    // 创建请求数据
//    QUrlQuery postData;
//    postData.addQueryItem("captcha", "44gd");
//    postData.addQueryItem("checkKey", "1700636569851");
//    // 将请求数据转换为字节数组
//    QByteArray postDataByteArray = postData.toString(QUrl::FullyEncoded).toUtf8();

    // 创建网络访问管理器
    QNetworkAccessManager manager;

//    // 执行POST请求
    QNetworkReply *reply = manager.post(request, postDataByteArray);

    // 创建事件循环,等待请求完成
    QEventLoop loop;
    QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
    loop.exec();

    // 检查请求是否成功
    if (reply->error() == QNetworkReply::NoError) {
        // 读取请求结果
        QByteArray responseData = reply->readAll();
        QString responseStr = responseData;
        // 处理请求结果
        qDebug() << "HTTP GET请求成功,返回数据:" << responseStr;
    } else {
        // 处理错误
        qDebug() << "HTTP GET请求失败:" << reply->errorString();
    }

    // 释放资源
    reply->deleteLater();

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用c++/qt写的项目,项目都经测试过,真实可靠,可供自己学习c++/qtQt是一个用标准C++编写的跨平台开发类库,它对标准C++进行了扩展,引入了元对象系统、信号与槽、属性等特性,使应用程序的开发变得更高效。 Qt类库中大量的类以模块形式分类组织的,包括基本模块和扩展模块等。一个模块通常就是一个编程主题,如数据库、图表、网络等。 一、Qt核心特点 1.1.概述 Qt本身并不是一种编程语言,它本质上是一个跨平台的C++开发类库,是用标准C++编写的类库,它为开发GUI应用程序和非GUI应用程序提供了各种类。 Qt对标准C++进行了扩展,引入了一些新概念和功能,例如信号和槽、对象属性等。Qt的元对象编译器(Meta-Object Compiler,MOC)是一个预处理器,在源程序被编译前先将这些Qt特性的程序转换为标准C++兼容的形式,然后再由标准C++编译器进行编译。这就是为什么在使用信号与槽机制的类里,必须添加一个Q_OBJECT宏的原因,只有添加了这个宏,moc才能对类里的信号与槽的代码进行预处理。 Qt Core模块是Qt类库的核心,所有其他模块都依赖于此模块,如果使用qmake来构建项目,Qt Core模块则是被自动加入的。 Qt为C++语言增加的特性就是在Qt Core模块里实现的,这些扩展特性由Qt的元对象系统实现,包括信号与槽机制、属性系统、动态类型转换等。 1.2.元对象系统 Qt的元对象系统(Meta-Object-System)提供了对象之间通信的信号与槽机制、运行时类型信息和动态属性系统。 元对象系统由以下三个基础组成: 1.QObject类是所有使用元对象系统的类的基类; 2.在一个类的private部分声明Q_OBJECT宏,使得类可以使用元对象的特性,如动态属性、信号与槽。 3.MOC(元对象编译器)为每个QObject的子类提供必要的代码来实现元对象系统的特征。 构建项目时,MOC工具读取C++源文件,当它发现类的定义里有Q_OBJECT宏时,它就会为这个类生成另外一个包含有元对象支持代码的C++源文件,这个生成的源文件连同类的实现文件一起被编译和连接。 除了信号和槽机制外,元对象还提供如下一些功能。 1.QObject::metaObject()函数返回类关联的元对象,元对象类QMetaObject包含了访问元对象的一些接口函数,例如QMetaObject::className()函数可在运行时返回类的名称字符串。 QObject obj=new QPushButton; obj->metaObject()->className(); 2.QMetaObject::newInstance()函数创建类的一个新的实例。 3.QObject::inherits(const charclassName)函数判断一个对象实例是否是名称为className的类或QObject的子类的实例。 1.3.属性系统 1.属性定义 Qt提供一个Q_PROPERTY()宏可以定义属性,它也是属于元对象系统实现的。Qt的属性系统与C++编译器无关,可以用任何标准的C++编译器编译定义了属性的Qt C++程序。 2.属性的使用 不管是否用READ和WRITE定义了接口函数,只要知道属性名称,就可以通过QObject::property()读取属性值,并通过QObject::setProperty()设置属性值。 3.动态属性 QObject::setProperty()函数可以在运行时为类定义一个新的属性,称之为动态属性。动态属性是针对类的实例定义的。 动态属性可以使用QObject::property()查询,就如在类定义里用Q_PROPERTY宏定义的属性一样。 例如,在数据表编辑界面上,一些字段是必填字段,就可以在初始化界面时为这些字段的关联显示组件定义一个新的required属性,并设置值为“true"。 4.类的附加信息 属性系统还有一个宏Q_CLASSINFO(),可以为类的元对象定义”名称——值“信息。
详细目录 1. 序 2. Qt 简介 3. Hello, world! 4. 信号槽 5. 自定义信号槽 6. Qt 模块简介 7. MainWindow 简介 8. 添加动作 9. 资源文件 10. 对象模型 11. 布局管理器 12. 菜单栏、工具栏和状态栏 13. 对话框简介 14. 对话框数据传递 15. 标准对话框 QMessageBox 16. 深入 Qt5 信号槽新语法 17. 文件对话框 18. 事件 19. 事件的接受与忽略 20. event() 21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. 贪吃蛇游戏(3) 34. 贪吃蛇游戏(4) 35. 文件 36. 二进制文件读写 37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. model/view 架构 42. QListWidget、QTreeWidget 和 QTableWidget 43. QStringListModel 44. QFileSystemModel 45. 模型 46. 视图和委托 47. 视图选择 48. QSortFilterProxyModel 49. 自定义只读模型 50. 自定义可编辑模型 51. 布尔表达式树模型 52. 使用拖放 53. 自定义拖放数据 54. 剪贴板 55. 数据库操作 56. 使用模型操作数据库 57. 可视化显示数据库数据 58. 编辑数据库外键 59. 使用流处理 XML 60. 使用 DOM 处理 XML 61. 使用 SAX 处理 XML 62. 保存 XML 63. 使用 QJson 处理 JSON 64. 使用 QJsonDocument 处理 JSON 65. 访问网络(1) 66. 访问网络(2) 67. 访问网络(3) 68. 访问网络(4) 69. 进程 70. 进程间通信 71. 线程简介 72. 线程和事件循环 73. Qt 线程相关类 74. 线程和 QObject 75. 线程总结 76. QML 和 QtQuick 2 77. QML 语法 78. QML 基本元素 79. QML 组件 80. 定位器 81. 元素布局 82. 输入元素 其他文章 宏定义中的 do {…} while (0) C++:在堆上创建对象,还是在栈上?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值