引言

QNetworkAccessManager 是 Qt 框架中用于处理网络请求的核心类,支持多种常见协议,如基于 HTTP/HTTPS 协议的 GET、POST、PUT 等请求功能,支持异步操作、信号槽机制和 cookie 管理。通常与 QNetworkRequestQNetworkReply 配合使用。

一、简述

QNetworkAccessManager允许应用程序发送网络请求和接收回复。
网络访问API是围绕一个QNetworkAccessManager对象构建,该对象保存其发送的请求的公共配置和设置。它包含代理和缓存配置,以及与这些问题相关的信号,以及可用于监视网络操作进度的回复信号。创建QNetworkAccessManager对象后,应用程序可以使用它通过网络发送请求。QNetworkRequest保存要与其一起发送的请求。其提供了一组标准函数(如:getpostput等),这些函数接受请求和可选数据,每个函数返回一个QNetworkReply对象。返回的对象用于获取响应相应请求而返回的数据。

    1. 请求完成后,需要手动删除QNetworkReply对象。在连接到其finished()信号的槽函数使用deleteLater()函数删除。
    1. QNetworkAccessManager会将接收到的请求排队。并行执行的请求数量取决于协议。目前,对于桌面平台上的HTTP协议,一个主机/端口组合并行执行6个请求。

二、例程

使用Apifox自带的示例项目进行接口测试:
在这里插入图片描述

2.1 发送GET请求

  • 运行结果如下所示:
    在这里插入图片描述

  • 源码:

#include <QCoreApplication>
#include <QObject>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 创建管理器
    QNetworkAccessManager manager;

    // 构造请求(示例为 GET 请求)
    QNetworkRequest request(QUrl("http://127.0.0.1:4523/m1/6845287-6559514-default/pet/1"));
    //request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");

    // 发送请求并连接信号槽
    QNetworkReply *reply = manager.get(request);
    QObject::connect(reply, &QNetworkReply::finished, [&]() {
        if (reply->error() == QNetworkReply::NoError) {
            qDebug() << "Response:" << reply->readAll();
        } else {
            qDebug() << "Error:" << reply->errorString();
        }
        reply->deleteLater();
    });

    return a.exec();
}

2.2 发送POST请求

  • 运行结果如下所示:
    在这里插入图片描述

  • 源码:

#include <QCoreApplication>
#include <QObject>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkReply>
#include <QDebug>

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 创建管理器
    QNetworkAccessManager manager;

    // 构造请求(示例为 POST 请求)
    QNetworkRequest request(QUrl("http://127.0.0.1:4523/m1/6845287-6559514-default/pet"));
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");

    // 发送的数据
    QByteArray postData;
    postData.append("name=Hello%20Kitty&status=sold"); // 表单数据示例

    // 发送请求并连接信号槽
    QNetworkReply *reply = manager.post(request, postData);
    QObject::connect(reply, &QNetworkReply::finished, [=]() {
        if (reply->error() == QNetworkReply::NoError) {
            QByteArray response = reply->readAll();
            qDebug() << "Response:" << response;
        } else {
            qDebug() << "Error:" << reply->errorString();
        }
        reply->deleteLater();
    });


    return a.exec();
}

三、参考链接

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐