You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
2.9 KiB

#include "HttpClient.h"
#include <QUrlQuery>
#include <QDebug>
HttpClient::HttpClient(QObject* parent /*= nullptr*/)
: QObject(parent)
, isFinish(true)
, manager(new QNetworkAccessManager(nullptr))
{
}
HttpClient::~HttpClient() {
if (nullptr != manager) {
// 取消所有未完成请求
auto replies = manager->findChildren<QNetworkReply*>();
for (auto reply : replies) {
reply->abort();
reply->deleteLater();
}
// 安全删除
manager->deleteLater();
manager = nullptr;
}
}
void HttpClient::get(const QUrl& baseUrl, const QString& token, const QMap<QString, QString>& 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<QNetworkReply*>(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();
}