networkaccessmanager.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #ifndef NETWORKACCESSMANAGER_H
  2. #define NETWORKACCESSMANAGER_H
  3. #include <QFuture>
  4. #include <QFutureInterface>
  5. #include <QHttpMultiPart>
  6. #include <QJsonArray>
  7. #include <QJsonDocument>
  8. #include <QJsonObject>
  9. #include <QJsonValue>
  10. #include <QList>
  11. #include <QNetworkAccessManager>
  12. #include <QNetworkReply>
  13. #include <QNetworkRequest>
  14. #include <functional>
  15. class NetworkAccessManager : public QNetworkAccessManager
  16. {
  17. Q_OBJECT
  18. public:
  19. static NetworkAccessManager* instance();
  20. protected:
  21. NetworkAccessManager(QObject* parent = nullptr);
  22. QNetworkReply* createRequest(Operation op,
  23. const QNetworkRequest& request,
  24. QIODevice* outgoingData = nullptr) override;
  25. };
  26. // HTTP 响应结构
  27. struct HttpResponse
  28. {
  29. int code = 0;
  30. QJsonValue data;
  31. QString message;
  32. };
  33. namespace TC {
  34. // 拦截器接口
  35. class Interceptor
  36. {
  37. public:
  38. virtual ~Interceptor() {}
  39. virtual void interceptRequest(QNetworkRequest& /*request*/) {}
  40. virtual void interceptResponse(QNetworkReply* /*reply*/) {}
  41. };
  42. // 请求客户端选项
  43. struct RequestClientOptions
  44. {
  45. QString baseURL;
  46. bool enableDefaultInterceptors = true;
  47. QString responseReturn = ""; // 可以是 "data" 或空
  48. int timeout = 10000; // 默认超时时间为10秒
  49. };
  50. // 请求客户端
  51. class RequestClient : public QObject
  52. {
  53. Q_OBJECT
  54. public:
  55. explicit RequestClient(const RequestClientOptions& options = RequestClientOptions());
  56. // 创建客户端实例
  57. static RequestClient* createClient(const QString& baseURL,
  58. const RequestClientOptions& options = RequestClientOptions());
  59. // 获取全局实例
  60. static RequestClient* requestClient(const RequestClientOptions& options = RequestClientOptions());
  61. static RequestClient* baseRequestClient(
  62. const RequestClientOptions& options = RequestClientOptions());
  63. // 拦截器管理
  64. void addInterceptor(Interceptor* interceptor);
  65. void removeInterceptor(Interceptor* interceptor);
  66. // 基础URL设置
  67. void setBaseUrl(const QString& url);
  68. QString baseUrl() const;
  69. void setTimeout(int timeout);
  70. int timeout() const;
  71. // 同步请求
  72. QNetworkReply* getSync(const QString& url, const QVariantMap& params = QVariantMap());
  73. QNetworkReply* postSync(const QString& url, const QJsonDocument& data = QJsonDocument());
  74. QNetworkReply* putSync(const QString& url, const QJsonDocument& data = QJsonDocument());
  75. QNetworkReply* deleteSync(const QString& url);
  76. QNetworkReply* uploadSync(const QString& url, QHttpMultiPart* multiPart);
  77. // 异步请求
  78. QFuture<HttpResponse> getAsync(const QString& url, const QVariantMap& params = QVariantMap());
  79. QFuture<HttpResponse> postAsync(const QString& url, const QJsonDocument& data = QJsonDocument());
  80. QFuture<HttpResponse> putAsync(const QString& url, const QJsonDocument& data = QJsonDocument());
  81. QFuture<HttpResponse> deleteAsync(const QString& url);
  82. QFuture<HttpResponse> uploadAsync(const QString& url, QHttpMultiPart* multiPart);
  83. QFuture<bool> downloadAsync(const QString& url, const QString& saveFilePath);
  84. bool download(const QString& url, const QString& saveFilePath);
  85. // Token 刷新相关
  86. bool isRefreshing() const { return m_isRefreshing; }
  87. void setRefreshing(bool refreshing) { m_isRefreshing = refreshing; }
  88. QList<std::function<void(const QString&)>>& refreshTokenQueue() { return m_refreshTokenQueue; }
  89. void setupAsyncConnections(QNetworkReply* reply, QFutureInterface<HttpResponse>& _interface);
  90. private:
  91. // 原始请求方法
  92. QNetworkReply* get(const QString& url, const QVariantMap& params = QVariantMap());
  93. QNetworkReply* post(const QString& url, const QJsonDocument& data = QJsonDocument());
  94. QNetworkReply* put(const QString& url, const QJsonDocument& data = QJsonDocument());
  95. QNetworkReply* deleteResource(const QString& url);
  96. QNetworkReply* upload(const QString& url, QHttpMultiPart* multiPart);
  97. void setupDefaultInterceptors();
  98. void processRequest(QNetworkRequest& request);
  99. void processResponse(QNetworkReply* reply);
  100. HttpResponse parseReplyData(QNetworkReply* reply);
  101. QString m_baseUrl;
  102. int m_timeout = 10000;
  103. QList<Interceptor*> interceptors;
  104. bool m_isRefreshing = false;
  105. QList<std::function<void(const QString&)>> m_refreshTokenQueue;
  106. };
  107. } // namespace TC
  108. #endif // NETWORKACCESSMANAGER_H