94 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef DORICNETWORKSERVICE_H
 | |
| #define DORICNETWORKSERVICE_H
 | |
| 
 | |
| #include <QDebug>
 | |
| #include <QJsonObject>
 | |
| #include <QJsonValue>
 | |
| #include <QNetworkAccessManager>
 | |
| #include <QNetworkReply>
 | |
| #include <QNetworkRequest>
 | |
| #include <QThread>
 | |
| 
 | |
| class InnerTask : public QObject {
 | |
|   Q_OBJECT
 | |
| private:
 | |
|   QNetworkRequest httpRequest;
 | |
|   QNetworkAccessManager networkAccessManager;
 | |
| 
 | |
| public:
 | |
|   explicit InnerTask() {
 | |
|     connect(this, &InnerTask::run, this, &InnerTask::innerRun);
 | |
|   }
 | |
| 
 | |
|   void innerRun(QJsonValue jsValue) {
 | |
|     QString url = jsValue["url"].toString();
 | |
|     QString method = jsValue["method"].toString();
 | |
| 
 | |
|     QJsonValue headerVal = jsValue["headers"];
 | |
|     QJsonValue dataVal = jsValue["data"];
 | |
|     QJsonValue timeoutVal = jsValue["timeout"];
 | |
| 
 | |
|     if (headerVal.isObject()) {
 | |
|       foreach (QString key, headerVal.toObject().keys()) {
 | |
|         httpRequest.setRawHeader(key.toUtf8(),
 | |
|                                  headerVal[key].toString().toUtf8());
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (method == "get") {
 | |
|       httpRequest.setUrl(QUrl(url));
 | |
|       QNetworkReply *reply = networkAccessManager.get(httpRequest);
 | |
| 
 | |
|       connect(reply, &QNetworkReply::finished, this, [this, reply] {
 | |
|         int statusCode =
 | |
|             reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
 | |
| 
 | |
|         if (reply->error() == QNetworkReply::NoError) {
 | |
|           emit response(statusCode, reply->readAll());
 | |
|         } else {
 | |
|           emit response(statusCode, QByteArray());
 | |
|         }
 | |
| 
 | |
|         reply->deleteLater();
 | |
|         this->deleteLater();
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| signals:
 | |
|   void run(QJsonValue jsValue);
 | |
|   void response(int code, QByteArray data);
 | |
| };
 | |
| 
 | |
| class DoricNetworkService : public QObject {
 | |
|   Q_OBJECT
 | |
| private:
 | |
|   QThread thread;
 | |
| 
 | |
|   static DoricNetworkService *local_instance;
 | |
|   DoricNetworkService() {
 | |
|     qDebug() << "constructor";
 | |
|     thread.start();
 | |
|   }
 | |
| 
 | |
|   ~DoricNetworkService() { qDebug() << "destructor"; }
 | |
| 
 | |
| public:
 | |
|   static DoricNetworkService *getInstance() {
 | |
|     static DoricNetworkService instance;
 | |
|     return &instance;
 | |
|   }
 | |
| 
 | |
|   QThread *getThread() { return &thread; }
 | |
| 
 | |
|   template <typename T>
 | |
|   void request(QJsonValue jsValue, QObject *receiver, T lambda) {
 | |
|     InnerTask *innerTask = new InnerTask();
 | |
|     innerTask->moveToThread(&thread);
 | |
| 
 | |
|     connect(innerTask, &InnerTask::response, receiver, lambda);
 | |
|     innerTask->run(jsValue);
 | |
|   }
 | |
| };
 | |
| 
 | |
| #endif // DORICNETWORKSERVICE_H
 |