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
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();
|
|
}
|
|
|