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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值