Qt QNetworkAccessManager 简述及例程
这里写目录标题
- 引言
- 一、简述
- 二、例程
- 2.1 发送GET请求
- 2.2 发送POST请求
- 三、参考链接
引言
QNetworkAccessManager
是 Qt 框架中用于处理网络请求的核心类,支持多种常见协议,如基于 HTTP/HTTPS 协议的 GET、POST、PUT 等请求功能,支持异步操作、信号槽机制和 cookie 管理。通常与QNetworkRequest
和QNetworkReply
配合使用。
一、简述
QNetworkAccessManager
允许应用程序发送网络请求和接收回复。
网络访问API是围绕一个QNetworkAccessManager
对象构建,该对象保存其发送的请求的公共配置和设置。它包含代理和缓存配置,以及与这些问题相关的信号,以及可用于监视网络操作进度的回复信号。创建QNetworkAccessManager
对象后,应用程序可以使用它通过网络发送请求。QNetworkRequest
保存要与其一起发送的请求。其提供了一组标准函数(如:get
、post
、put
等),这些函数接受请求和可选数据,每个函数返回一个QNetworkReply
对象。返回的对象用于获取响应相应请求而返回的数据。
-
- 请求完成后,需要手动删除QNetworkReply对象。在连接到其
finished()信号
的槽函数使用deleteLater()函数删除。
- 请求完成后,需要手动删除QNetworkReply对象。在连接到其
-
- 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();
}
三、参考链接
- Qt 实战教程:使用 QNetworkAccessManager 发送 HTTP POST:https://blog.csdn.net/2401_87117051/article/details/149858699
- QT httpServer多线程后台服务器的例子实现:https://blog.csdn.net/qq_44667165/article/details/138282615
- QT5.12编译QtHttpServer,亲测可用:https://blog.csdn.net/billcoco/article/details/148846299?spm=1001.2101.3001.6650.1