#include "HttpClient.h" #include #include HttpClient::HttpClient(QObject* parent /*= nullptr*/) : QObject(parent) , isFinish(true) , manager(new QNetworkAccessManager(nullptr)) { } HttpClient::~HttpClient() { if (nullptr != manager) { // 取消所有未完成请求 auto replies = manager->findChildren(); for (auto reply : replies) { reply->abort(); reply->deleteLater(); } // 安全删除 manager->deleteLater(); manager = nullptr; } } void HttpClient::get(const QUrl& baseUrl, const QString& token, const QMap& params) { QUrl url(baseUrl); // 加入参数 QUrlQuery query; for (auto it = params.constBegin(); it != params.constEnd(); ++it) { query.addQueryItem(it.key(), it.value()); } if(!query.isEmpty()) url.setQuery(query); // 创建请求 QNetworkRequest request(url); // 设置头 request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); if (!token.isEmpty()) { request.setRawHeader("Authorization", QString("Bearer %1").arg(token).toUtf8()); } // 请求 QNetworkReply* reply = manager->get(request); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleError(QNetworkReply::NetworkError))); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { handleResponse(reply); } else { handleError(reply->error()); } reply->deleteLater(); }); isFinish = false; } void HttpClient::post(const QUrl& baseUrl, const QJsonObject& data, const QString& token /* = "" */) { // 创建请求 QNetworkRequest request(baseUrl); // 设置头 request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); if (!token.isEmpty()) { request.setRawHeader("Authorization", QString("Bearer %1").arg(token).toUtf8()); } QByteArray postData = QJsonDocument(data).toJson(); // 请求 QNetworkReply* reply = manager->post(request, postData); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleError(QNetworkReply::NetworkError))); connect(reply, &QNetworkReply::finished, [=]() { if (reply->error() == QNetworkReply::NoError) { handleResponse(reply); } reply->deleteLater(); }); isFinish = false; } void HttpClient::handleError(QNetworkReply::NetworkError code) { QNetworkReply* reply = qobject_cast(sender()); qDebug() << "Network error:" << code << reply->errorString(); } void HttpClient::handleResponse(QNetworkReply* reply) { if (reply->error() != QNetworkReply::NoError) { qDebug() << "Error:" << reply->errorString(); emit error(reply->errorString()); reply->deleteLater(); return; } const QByteArray data = reply->readAll(); QJsonParseError parseError; QJsonDocument doc = QJsonDocument::fromJson(data, &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSON parse error:" << parseError.errorString(); emit error(parseError.errorString()); } else { emit finished(doc); } reply->deleteLater(); }