做水果代理去哪个网站,本人承接网站建设,企业信用网站建设,怎么修改自己网站内容一、HTTP客户端类功能#xff1a; 1、POST请求发送#xff1a; 支持发送JSON格式的数据自动处理请求头设置提供上传进度监控、 2、GET请求发送#xff1a; 简单的GET请求实现支持下载进度监控 3、状态监控#xff1a; 通过信号槽机制监控上传/下载进度错误处理和状态回调 /… 一、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::functionvoid(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::functionvoid(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::functionvoid(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 QScopedPointervoid someFunction() {QScopedPointerHttpClient 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;}}
); 注意事项 如果 HttpClient 作为 QObject 的子对象创建会随父对象自动删除不需要手动删除使用 deleteLater() 而不是直接 delete确保在 Qt 事件循环中安全删除对象如果有正在进行的网络请求建议等待请求完成后再删除 HttpClient使用智能指针可以避免手动管理内存推荐使用