Skip to content

Commit c5ccaf4

Browse files
authored
class AnyNetworkAccessManager (#17)
1 parent 7078063 commit c5ccaf4

9 files changed

+156
-47
lines changed

BackendlessAPI.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@
1414
#include <QJsonObject>
1515
#include "BackendlessAPI.hpp"
1616

17-
BackendlessAPI::BackendlessAPI(QString _appId, QString _apiKey, QString _endpoint): QObject(),
18-
userAPI(&networkAccessManager, _appId, _apiKey, _endpoint),
17+
BackendlessAPI::BackendlessAPI(AnyNetworkAccessManager* _networkAccessManager, QString _appId, QString _apiKey, QString _endpoint): QObject(),
18+
networkAccessManager(_networkAccessManager),
19+
userAPI(_networkAccessManager, _appId, _apiKey, _endpoint),
1920
appId(_appId),
2021
apiKey(_apiKey),
2122
endpoint(_endpoint) {
@@ -24,12 +25,12 @@ BackendlessAPI::BackendlessAPI(QString _appId, QString _apiKey, QString _endpoin
2425

2526
void BackendlessAPI::addItemToTable(QString tableName, PostParams params) {
2627
request(
27-
&networkAccessManager,
28+
networkAccessManager,
2829
this,
2930
endpoint + appId + "/" + apiKey + "/data/" + tableName,
3031
params,
3132
BERequestMethod::post,
32-
[&](QString replyValue){
33+
[&](auto replyValue){
3334
qDebug() << replyValue;
3435
emit itemAdded();
3536
}
@@ -38,14 +39,14 @@ void BackendlessAPI::addItemToTable(QString tableName, PostParams params) {
3839

3940
void BackendlessAPI::deleteItemFromTable(QString tableName, QString objectId) {
4041
request(
41-
&networkAccessManager,
42+
networkAccessManager,
4243
this,
4344
endpoint + appId + "/" + apiKey + "/data/" + tableName + "/" + objectId,
4445
{
4546

4647
},
4748
BERequestMethod::deleteResource,
48-
[&](QByteArray replyValue){
49+
[&](auto replyValue){
4950
qDebug() << replyValue;
5051
extractResult<DeletionResult>(
5152
replyValue,
@@ -65,14 +66,14 @@ void BackendlessAPI::deleteItemFromTable(QString tableName, QString objectId) {
6566

6667
void BackendlessAPI::loadTableItems(QString tableName) {
6768
request(
68-
&networkAccessManager,
69+
networkAccessManager,
6970
this,
7071
endpoint + appId + "/" + apiKey + "/data/" + tableName + "?pageSize=100",
7172
{
7273

7374
},
7475
BERequestMethod::get,
75-
[&](QString replyValue){
76+
[&](auto replyValue){
7677
qDebug() << replyValue;
7778
#ifdef BACKENDLESS_VARIANT_RESPONSE
7879

BackendlessAPI.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ struct DeletionResult {
2121
DeletionResult(QJsonObject jsonObject): deletionTime(jsonObject["deletionTime"].toInteger()) { }
2222
};
2323

24+
class AnyNetworkAccessManager;
25+
2426
class BackendlessAPI: public QObject, public BasicAPI {
2527
Q_OBJECT
2628

2729
public:
28-
BackendlessAPI(QString _appId, QString _apiKey, QString _endpoint = "https://eu-api.backendless.com/");
30+
BackendlessAPI(AnyNetworkAccessManager* _networkAccessManager, QString _appId, QString _apiKey, QString _endpoint = "https://eu-api.backendless.com/");
2931
void addItemToTable(QString, PostParams);
3032
void deleteItemFromTable(QString, QString);
3133
void loadTableItems(QString);
@@ -45,7 +47,7 @@ class BackendlessAPI: public QObject, public BasicAPI {
4547
BackendlessUserAPI userAPI;
4648

4749
private:
48-
QNetworkAccessManager networkAccessManager;
50+
AnyNetworkAccessManager* networkAccessManager;
4951
QString appId;
5052
QString apiKey;
5153
QString endpoint;

BackendlessQt.pro

+4-2
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@ SOURCES += \
88
BasicAPI.cpp \
99
BackendlessAPI.cpp \
1010
BackendlessUserAPI.cpp \
11-
BackendlessUser.cpp
11+
BackendlessUser.cpp \
12+
StandardNetworkManager.cpp
1213

1314
HEADERS += \
1415
BasicAPI.hpp \
1516
BackendlessAPI.hpp \
1617
BackendlessUserAPI.hpp \
17-
BackendlessUser.hpp
18+
BackendlessUser.hpp \
19+
StandardNetworkManager.hpp

BackendlessUserAPI.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
#include <QFile>
1717
#include "BackendlessUserAPI.hpp"
1818

19-
BackendlessUserAPI::BackendlessUserAPI(QNetworkAccessManager* _networkAccessManager, QString _appId, QString _apiKey, QString _endpoint): QObject(),
19+
BackendlessUserAPI::BackendlessUserAPI(AnyNetworkAccessManager* _networkAccessManager, QString _appId, QString _apiKey, QString _endpoint): QObject(),
2020
networkAccessManager(_networkAccessManager),
2121
appId(_appId),
2222
apiKey(_apiKey),
@@ -32,7 +32,7 @@ void BackendlessUserAPI::registerUser(BackendlessRegisterUserRepresentable& user
3232
endpoint + appId + "/" + apiKey + "/users/register",
3333
user.getAllParams(),
3434
BERequestMethod::post,
35-
[&](QByteArray replyValue){
35+
[&](auto replyValue){
3636
qDebug() << replyValue;
3737

3838
emit registerUserResult();
@@ -50,7 +50,7 @@ void BackendlessUserAPI::signInUser(QString login, QString password) {
5050
{"password", new StringPostParam(password)}
5151
},
5252
BERequestMethod::post,
53-
[&](QByteArray replyValue){
53+
[&](auto replyValue){
5454
qDebug() << replyValue;
5555

5656
#ifdef BACKENDLESS_VARIANT_RESPONSE
@@ -118,7 +118,7 @@ void BackendlessUserAPI::validateUserToken() {
118118

119119
},
120120
BERequestMethod::get,
121-
[&](QByteArray replyValue) {
121+
[&](auto replyValue) {
122122
qDebug() << replyValue;
123123

124124
#ifdef BACKENDLESS_VARIANT_RESPONSE
@@ -151,7 +151,7 @@ void BackendlessUserAPI::restorePassword(QString email) {
151151

152152
},
153153
BERequestMethod::get,
154-
[&](QByteArray replyValue){
154+
[&](auto replyValue){
155155
qDebug() << replyValue;
156156

157157
emit restorePasswordSuccess(replyValue);

BackendlessUserAPI.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818
#include "BackendlessUser.hpp"
1919
#include "BasicAPI.hpp"
2020

21+
class AnyNetworkAccessManager;
22+
2123
class BackendlessUserAPI: public QObject, public BasicAPI {
2224
Q_OBJECT
2325

2426
public:
25-
BackendlessUserAPI(QNetworkAccessManager*, QString _appId, QString _apiKey, QString _endpoint = "https://eu-api.backendless.com/");
27+
BackendlessUserAPI(AnyNetworkAccessManager*, QString _appId, QString _apiKey, QString _endpoint = "https://eu-api.backendless.com/");
2628

2729
void registerUser(BackendlessRegisterUserRepresentable&);
2830
void signInUser(QString, QString);
@@ -56,7 +58,7 @@ class BackendlessUserAPI: public QObject, public BasicAPI {
5658
void restorePasswordSuccess(QString);
5759

5860
private:
59-
QNetworkAccessManager* networkAccessManager;
61+
AnyNetworkAccessManager* networkAccessManager;
6062
QString appId;
6163
QString apiKey;
6264
QString endpoint;

BasicAPI.cpp

+5-27
Original file line numberDiff line numberDiff line change
@@ -15,47 +15,25 @@
1515
#include "BasicAPI.hpp"
1616

1717
void BasicAPI::request(
18-
QNetworkAccessManager* networkAccessManager,
18+
AnyNetworkAccessManager* networkAccessManager,
1919
const QObject* context,
2020
QString urlString,
2121
PostParams customParams,
2222
BERequestMethod method,
2323
std::function<void(QByteArray)> const& handleRequest
2424
) {
25-
QUrl url(urlString);
26-
QNetworkRequest request(url);
27-
28-
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
29-
30-
QString params = "{";
31-
32-
for (auto [key, value] : customParams.asKeyValueRange()) {
33-
params += "\"";
34-
params += key;
35-
params += "\"";
36-
params += ":";
37-
params += value->asParam();
38-
params += ",";
39-
}
40-
41-
params.removeLast();
42-
params += "}";
43-
44-
QObject::connect(networkAccessManager, &QNetworkAccessManager::finished, context, [handleRequest](QNetworkReply* reply) {
45-
handleRequest(reply->readAll());
46-
}, Qt::SingleShotConnection);
4725
switch (method) {
4826
case BERequestMethod::get:
49-
networkAccessManager->get(request);
27+
networkAccessManager->get(urlString, context, handleRequest);
5028
break;
5129
case BERequestMethod::post:
52-
networkAccessManager->post(request, params.toUtf8());
30+
networkAccessManager->post(urlString, customParams, context, handleRequest);
5331
break;
5432
case BERequestMethod::deleteResource:
55-
networkAccessManager->deleteResource(request);
33+
networkAccessManager->deleteResource(urlString, context, handleRequest);
5634
break;
5735
case BERequestMethod::put:
58-
networkAccessManager->put(request, params.toUtf8());
36+
networkAccessManager->put(urlString, customParams, context, handleRequest);
5937
break;
6038
}
6139
}

BasicAPI.hpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <QMap>
1414
#include <QNetworkAccessManager>
1515
#include <QJsonObject>
16+
#include <QJsonParseError>
1617

1718
class PostParam {
1819
public:
@@ -110,10 +111,18 @@ enum class BERequestMethod {
110111
deleteResource
111112
};
112113

114+
class AnyNetworkAccessManager {
115+
public:
116+
virtual void get(QString, const QObject*, std::function<void(QByteArray)> const&) = 0;
117+
virtual void post(QString, PostParams, const QObject*, std::function<void(QByteArray)> const&) = 0;
118+
virtual void put(QString, PostParams, const QObject*, std::function<void(QByteArray)> const&) = 0;
119+
virtual void deleteResource(QString, const QObject*, std::function<void(QByteArray)> const&) = 0;
120+
};
121+
113122
class BasicAPI {
114123
protected:
115124
void request(
116-
QNetworkAccessManager*,
125+
AnyNetworkAccessManager*,
117126
const QObject*,
118127
QString,
119128
PostParams,

StandardNetworkManager.cpp

+87
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
//
2+
// StandardNetworkManager.cpp
3+
// BackendlessQt
4+
//
5+
// Created by Roman Podymov on 27/10/2024.
6+
// Copyright © 2024 BackendlessQt. All rights reserved.
7+
//
8+
9+
#include "StandardNetworkManager.hpp"
10+
#include <QNetworkRequest>
11+
#include <QNetworkReply>
12+
13+
void StandardNetworkManager::get(QString urlString, const QObject* context, std::function<void(QByteArray)> const& handleRequest) {
14+
QUrl url(urlString);
15+
QNetworkRequest request(url);
16+
17+
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
18+
19+
QObject::connect(&manager, &QNetworkAccessManager::finished, context, [handleRequest](auto reply) {
20+
handleRequest(reply->readAll());
21+
}, Qt::SingleShotConnection);
22+
manager.get(request);
23+
}
24+
25+
void StandardNetworkManager::post(QString urlString, PostParams customParams, const QObject* context, std::function<void(QByteArray)> const& handleRequest) {
26+
QUrl url(urlString);
27+
QNetworkRequest request(url);
28+
29+
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
30+
31+
QString params = "{";
32+
33+
for (auto [key, value] : customParams.asKeyValueRange()) {
34+
params += "\"";
35+
params += key;
36+
params += "\"";
37+
params += ":";
38+
params += value->asParam();
39+
params += ",";
40+
}
41+
42+
params.removeLast();
43+
params += "}";
44+
45+
QObject::connect(&manager, &QNetworkAccessManager::finished, context, [handleRequest](auto reply) {
46+
handleRequest(reply->readAll());
47+
}, Qt::SingleShotConnection);
48+
manager.post(request, params.toUtf8());
49+
}
50+
51+
void StandardNetworkManager::put(QString urlString, PostParams customParams, const QObject* context, std::function<void(QByteArray)> const& handleRequest) {
52+
QUrl url(urlString);
53+
QNetworkRequest request(url);
54+
55+
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
56+
57+
QString params = "{";
58+
59+
for (auto [key, value] : customParams.asKeyValueRange()) {
60+
params += "\"";
61+
params += key;
62+
params += "\"";
63+
params += ":";
64+
params += value->asParam();
65+
params += ",";
66+
}
67+
68+
params.removeLast();
69+
params += "}";
70+
71+
QObject::connect(&manager, &QNetworkAccessManager::finished, context, [handleRequest](auto reply) {
72+
handleRequest(reply->readAll());
73+
}, Qt::SingleShotConnection);
74+
manager.put(request, params.toUtf8());
75+
}
76+
77+
void StandardNetworkManager::deleteResource(QString urlString, const QObject* context, std::function<void(QByteArray)> const& handleRequest) {
78+
QUrl url(urlString);
79+
QNetworkRequest request(url);
80+
81+
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
82+
83+
QObject::connect(&manager, &QNetworkAccessManager::finished, context, [handleRequest](auto reply) {
84+
handleRequest(reply->readAll());
85+
}, Qt::SingleShotConnection);
86+
manager.deleteResource(request);
87+
}

StandardNetworkManager.hpp

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//
2+
// StandardNetworkManager.hpp
3+
// BackendlessQt
4+
//
5+
// Created by Roman Podymov on 27/10/2024.
6+
// Copyright © 2024 BackendlessQt. All rights reserved.
7+
//
8+
9+
#ifndef STANDARD_NETWORK_MANAGER_H
10+
#define STANDARD_NETWORK_MANAGER_H
11+
12+
#include "BasicAPI.hpp"
13+
#include <QString>
14+
#include <QByteArray>
15+
#include <QNetworkAccessManager>
16+
17+
class StandardNetworkManager: public AnyNetworkAccessManager {
18+
public:
19+
void get(QString, const QObject*, std::function<void(QByteArray)> const&) override;
20+
void post(QString, PostParams, const QObject*, std::function<void(QByteArray)> const&) override;
21+
void put(QString, PostParams, const QObject* context, std::function<void(QByteArray)> const&) override;
22+
void deleteResource(QString, const QObject* context, std::function<void(QByteArray)> const&) override;
23+
24+
private:
25+
QNetworkAccessManager manager;
26+
};
27+
28+
#endif

0 commit comments

Comments
 (0)