需要添加的头文件
//.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();