当前位置: 首页 > news >正文

Qt之http客户端类

  一、HTTP客户端类功能:

1、POST请求发送:

  • 支持发送JSON格式的数据
  • 自动处理请求头设置
  • 提供上传进度监控、

2、GET请求发送:

  • 简单的GET请求实现
  • 支持下载进度监控

3、状态监控:

  • 通过信号槽机制监控上传/下载进度
  • 错误处理和状态回调
/*** @file HttpClient.h* @brief HTTP客户端类,用于处理HTTP请求* @details 提供异步HTTP请求功能,支持GET和POST方法,包含进度监控和错误处理*/#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QEventLoop>/*** @class HttpClient* @brief HTTP客户端类,继承自QObject* @details 封装了Qt网络请求功能,提供简单的接口进行HTTP通信*/
class HttpClient : public QObject 
{Q_OBJECTpublic:/*** @brief 构造函数* @param parent 父对象指针,用于Qt对象树管理*/explicit HttpClient(QObject *parent = nullptr) : QObject(parent) {manager = new QNetworkAccessManager(this);}/*** @brief 析构函数* @details 清理网络管理器资源*/~HttpClient() {if (manager) {manager->deleteLater();manager = nullptr;}}/*** @brief 发送POST请求* @param url 目标URL地址* @param data 要发送的JSON数据* @param callback 请求完成后的回调函数,参数为(是否成功, 响应内容/错误信息)*/void sendPostRequest(const QString& url, const QJsonObject& data, std::function<void(bool success, const QString& response)> callback) {// 创建网络请求对象QNetworkRequest request(url);// 设置请求头为JSON格式request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");// 将JSON对象转换为字节数组QJsonDocument doc(data);QByteArray postData = doc.toJson();// 发送POST请求QNetworkReply* reply = manager->post(request, postData);// 连接完成信号到响应处理函数connect(reply, &QNetworkReply::finished, this, [=]() {handleResponse(reply, callback);});// 连接上传进度信号connect(reply, &QNetworkReply::uploadProgress, this, &HttpClient::onUploadProgress);// 连接下载进度信号connect(reply, &QNetworkReply::downloadProgress, this,&HttpClient::onDownloadProgress);}/*** @brief 发送GET请求* @param url 目标URL地址* @param callback 请求完成后的回调函数,参数为(是否成功, 响应内容/错误信息)*/void sendGetRequest(const QString& url,std::function<void(bool success, const QString& response)> callback) {QNetworkRequest request(url);QNetworkReply* reply = manager->get(request);connect(reply, &QNetworkReply::finished, this, [=]() {handleResponse(reply, callback);});}signals:/*** @brief 上传进度信号* @param bytesSent 已发送的字节数* @param bytesTotal 总字节数*/void uploadProgressChanged(qint64 bytesSent, qint64 bytesTotal);/*** @brief 下载进度信号* @param bytesReceived 已接收的字节数* @param bytesTotal 总字节数*/void downloadProgressChanged(qint64 bytesReceived, qint64 bytesTotal);private slots:/*** @brief 处理上传进度的槽函数* @param bytesSent 已发送的字节数* @param bytesTotal 总字节数*/void onUploadProgress(qint64 bytesSent, qint64 bytesTotal) {emit uploadProgressChanged(bytesSent, bytesTotal);}/*** @brief 处理下载进度的槽函数* @param bytesReceived 已接收的字节数* @param bytesTotal 总字节数*/void onDownloadProgress(qint64 bytesReceived, qint64 bytesTotal) {emit downloadProgressChanged(bytesReceived, bytesTotal);}private:/** @brief 网络访问管理器指针 */QNetworkAccessManager* manager;/*** @brief 处理网络响应* @param reply 网络响应对象指针* @param callback 回调函数* @details 处理请求完成后的响应数据或错误信息,并调用回调函数*/void handleResponse(QNetworkReply* reply,std::function<void(bool success, const QString& response)> callback) {if (reply->error() == QNetworkReply::NoError) {// 请求成功,读取响应数据QString response = QString::fromUtf8(reply->readAll());callback(true, response);} else {// 请求失败,获取错误信息QString errorString = reply->errorString();callback(false, errorString);}// 清理响应对象reply->deleteLater();}
};

二、使用方式

1、作为类成员变量使用

class MyClass : public QObject {Q_OBJECT
private:HttpClient* httpClient;public:MyClass(QObject* parent = nullptr) : QObject(parent) {httpClient = new HttpClient(this);  // 将this作为父对象}// 不需要显式删除,会随父对象自动删除~MyClass() {// httpClient会自动删除,不需要手动删除}
};

2、 作为局部变量使用

void someFunction() {// 在栈上创建HttpClient client;// 使用client发送请求client.sendPostRequest("...", data, [](bool success, const QString& response) {// 处理响应});// client会在函数结束时自动销毁
}

3、动态分配使用

void someFunction() {// 动态创建HttpClient* client = new HttpClient();// 使用client发送请求client->sendPostRequest("...", data, [client](bool success, const QString& response) {// 处理响应// 在回调中删除clientclient->deleteLater();});
}

4、使用智能指针

#include <QScopedPointer>void someFunction() {QScopedPointer<HttpClient> client(new HttpClient());// 使用client发送请求client->sendPostRequest("...", data, [](bool success, const QString& response) {// 处理响应});// client会在QScopedPointer销毁时自动删除
}

 三、示例

// 创建客户端实例
HttpClient* client = new HttpClient(this);// 监听进度信号
connect(client, &HttpClient::uploadProgressChanged, this, [](qint64 sent, qint64 total) {qDebug() << "Upload progress:" << sent << "/" << total;
});// 准备POST数据
QJsonObject data;
data["name"] = "test";
data["value"] = 123;// 发送POST请求
client->sendPostRequest("http://api.example.com/endpoint", data, [](bool success, const QString& response) {if (success) {qDebug() << "Response:" << response;} else {qDebug() << "Error:" << response;}}
);

 

注意事项:

  1. 如果 HttpClient 作为 QObject 的子对象创建,会随父对象自动删除,不需要手动删除
  2. 使用 deleteLater() 而不是直接 delete,确保在 Qt 事件循环中安全删除对象
  3. 如果有正在进行的网络请求,建议等待请求完成后再删除 HttpClient
  4. 使用智能指针可以避免手动管理内存,推荐使用
http://www.lryc.cn/news/520423.html

相关文章:

  • 18.C语言文件操作详解:指针、打开、读取与写入
  • 深入浅出 OpenResty
  • 在 .NET 9 中使用 Scalar 替代 Swagger
  • ue5 蒙太奇,即上半身动画和下半身组合在一起,并使用。学习b站库得科技
  • 多活架构的实现原理与应用场景解析
  • 一 rk3568 Android 11固件开发环境搭建 (docker)
  • 小结:华为路由器常用的操作指令
  • 旅游网站设计与实现
  • 【AI大模型】BERT GPT ELMo模型的对比
  • qt 快捷功能 快速生成 setter getter 构造函数 父类虚函数重写 成员函数实现 代码框架 查看父类及父类中的虚函数
  • 【计算机网络】深入浅出计算机网络
  • springMVC---resultful风格
  • 汽车基础软件AutoSAR自学攻略(三)-AutoSAR CP分层架构(2)
  • IntelliJ IDEA 主题插件
  • 2025最新JAVA面试八股文【基础篇】
  • element plus 使用 el-tree 组件设置默认选中和获取所有选中节点id
  • 高级java每日一道面试题-2025年01月09日-数据库篇-视图是什么?
  • python学习整理
  • Qt 5.14.2 学习记录 —— 십이 QLineEdit、QTextEdit
  • 【LC】2270. 分割数组的方案数
  • 【办公类-99-01】20250103用“课题阶段资料模版“批量制作“7个课题档案袋“
  • Objective-C语言的面向对象编程
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(11)横梁中点挠度仿真结果与计算结果对比
  • GO语言实现KMP算法
  • 【2024年华为OD机试】(A卷,100分)- 打印机队列(Java JS PythonC/C++)
  • SQL语言的面向对象编程
  • android分区和root
  • WebScoket-服务器客户端双向通信
  • 如何在QT中保证线程是安全的?
  • Lock接口