1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "restaccessmanager.h"
using namespace Qt::StringLiterals;
static constexpr auto contentTypeJson = "application/json"_L1;
// A custom authorization scheme implemented by the Qt example server
static const auto authorizationToken = "TOKEN"_ba;
static bool httpResponseSuccess(QNetworkReply* reply)
{
const int httpStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
const bool isReplyError = (reply->error() != QNetworkReply::NoError);
qDebug() << "Request to path" << reply->request().url().path() << "finished";
if (isReplyError)
qDebug() << "Error" << reply->error();
else
qDebug() << "HTTP:" << httpStatusCode;
return (!isReplyError && (httpStatusCode >= 200 && httpStatusCode < 300));
}
RestAccessManager::RestAccessManager(QObject *parent)
: QNetworkAccessManager{parent}
{
}
void RestAccessManager::setUrl(const QUrl& url)
{
m_url = url;
}
bool RestAccessManager::sslSupported() const
{
#if QT_CONFIG(ssl)
return QSslSocket::supportsSsl();
#else
return false;
#endif
}
void RestAccessManager::setAuthorizationToken(const QByteArray& token)
{
m_authorizationToken = token;
}
void RestAccessManager::post(const QString& api, const QVariantMap& value,
ResponseCallback callback)
{
m_url.setPath(api);
auto request = QNetworkRequest(m_url);
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, contentTypeJson);
request.setRawHeader(authorizationToken, m_authorizationToken);
QNetworkReply* reply = QNetworkAccessManager::post(request,
QJsonDocument::fromVariant(value).toJson(QJsonDocument::Compact));
QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
callback(reply, httpResponseSuccess(reply));
});
}
void RestAccessManager::get(const QString& api, const QUrlQuery& parameters,
ResponseCallback callback)
{
m_url.setPath(api);
m_url.setQuery(parameters);
auto request = QNetworkRequest(m_url);
QNetworkReply* reply = QNetworkAccessManager::get(request);
QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
callback(reply, httpResponseSuccess(reply));
});
}
void RestAccessManager::put(const QString& api, const QVariantMap& value,
ResponseCallback callback)
{
m_url.setPath(api);
auto request = QNetworkRequest(m_url);
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader, contentTypeJson);
request.setRawHeader(authorizationToken, m_authorizationToken);
QNetworkReply* reply = QNetworkAccessManager::put(request,
QJsonDocument::fromVariant(value).toJson(QJsonDocument::Compact));
QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
callback(reply, httpResponseSuccess(reply));
});
}
void RestAccessManager::deleteResource(const QString& api, ResponseCallback callback)
{
m_url.setPath(api);
auto request = QNetworkRequest(m_url);
request.setRawHeader(authorizationToken, m_authorizationToken);
QNetworkReply* reply = QNetworkAccessManager::deleteResource(request);
QObject::connect(reply, &QNetworkReply::finished, reply, [reply, callback](){
callback(reply, httpResponseSuccess(reply));
});
}
|