#include "HttpClientSync.h" #include #include #include #include HttpClientSync::HttpClientSync(QObject* parent /* = nullptr */) : QObject(parent) { } HttpClientSync::~HttpClientSync() { } std::future> HttpClientSync::get(const QUrl& baseUrl, const QString& token, const QMap& params, int timeoutMs/* = 5000*/) { auto promise = std::make_shared>>(); std::future> future = promise->get_future(); // 必须在主线程创建QObject QMetaObject::invokeMethod(QCoreApplication::instance(), [=]() { QNetworkAccessManager* manager = new QNetworkAccessManager(); 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); // 超时处理 QTimer* timer = nullptr; if (timeoutMs > 0) { timer = new QTimer(); timer->setSingleShot(true); QObject::connect(timer, &QTimer::timeout, [=]() { reply->abort(); promise->set_value({ false, QJsonDocument() }); // 超时返回 manager->deleteLater(); timer->deleteLater(); }); timer->start(timeoutMs); } QObject::connect(reply, &QNetworkReply::finished, [=]() { if (nullptr != timer) timer->stop(); if (reply->error() == QNetworkReply::NoError) { promise->set_value({ true, QJsonDocument::fromJson(reply->readAll()) }); } else { promise->set_value({ false, QJsonDocument() }); } manager->deleteLater(); if (nullptr != timer) timer->deleteLater(); }); }); return future; } std::future> HttpClientSync::post(const QUrl& url, const QJsonObject& data, const QString& token /* = "" */, int timeoutMs /* = 5000 */) { auto promise = std::make_shared>>(); auto future = promise->get_future(); QMetaObject::invokeMethod(QCoreApplication::instance(), [=]() { QNetworkAccessManager* manager = new QNetworkAccessManager(); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); if (!token.isEmpty()) { request.setRawHeader("Authorization", "Bearer " + token.toUtf8()); } // 准备POST数据 QByteArray postData = QJsonDocument(data).toJson(); QNetworkReply* reply = manager->post(request, postData); QTimer* timer = new QTimer(); timer->setSingleShot(true); // 超时处理 QObject::connect(timer, &QTimer::timeout, [=]() { reply->abort(); promise->set_value({ false, QJsonDocument() }); manager->deleteLater(); timer->deleteLater(); }); timer->start(timeoutMs); // 响应处理 QObject::connect(reply, &QNetworkReply::finished, [=]() { timer->stop(); bool success = false; QJsonDocument json; if (reply->error() == QNetworkReply::NoError) { QJsonParseError parseError; json = QJsonDocument::fromJson(reply->readAll(), &parseError); success = (parseError.error == QJsonParseError::NoError); } promise->set_value({ success, json }); manager->deleteLater(); timer->deleteLater(); }); }); return future; }