networkaccessmanager.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #ifndef NETWORKACCESSMANAGER_H
  2. #define NETWORKACCESSMANAGER_H
  3. #include <QFuture>
  4. #include <QHttpMultiPart>
  5. #include <QJsonDocument>
  6. #include <QMutex>
  7. #include <QMutexLocker>
  8. #include <QNetworkAccessManager>
  9. #include <QNetworkReply>
  10. #include <QNetworkRequest>
  11. #include <QSharedPointer>
  12. #include <functional>
  13. #include <memory>
  14. class NetworkAccessManager : public QNetworkAccessManager
  15. {
  16. Q_OBJECT
  17. public:
  18. static NetworkAccessManager* instance();
  19. protected:
  20. NetworkAccessManager(QObject* parent = nullptr);
  21. QNetworkReply* createRequest(Operation op,
  22. const QNetworkRequest& request,
  23. QIODevice* outgoingData = nullptr) override;
  24. };
  25. struct HttpResponse
  26. {
  27. int code = 0;
  28. QJsonValue data;
  29. QString message;
  30. QByteArray rawData;
  31. };
  32. namespace TC {
  33. class Interceptor
  34. {
  35. public:
  36. virtual ~Interceptor() = default;
  37. virtual void interceptRequest(QNetworkRequest& request) = 0;
  38. virtual void interceptResponse(QNetworkReply* reply) = 0;
  39. };
  40. struct RequestClientOptions
  41. {
  42. QString baseURL;
  43. bool enableDefaultInterceptors = true;
  44. int timeout = 10000; // 默认超时时间为10秒
  45. };
  46. class RequestClient : public QObject
  47. {
  48. Q_OBJECT
  49. public:
  50. using Ptr = QSharedPointer<RequestClient>;
  51. explicit RequestClient(const RequestClientOptions& options = RequestClientOptions());
  52. virtual ~RequestClient() = default;
  53. // 禁用拷贝和赋值
  54. RequestClient(const RequestClient&) = delete;
  55. RequestClient& operator=(const RequestClient&) = delete;
  56. // 创建客户端实例
  57. static Ptr create(const QString& baseURL = "",
  58. const RequestClientOptions& options = RequestClientOptions());
  59. // 获取全局实例
  60. static Ptr globalInstance();
  61. static Ptr baseGlobalInstance();
  62. // 拦截器管理
  63. void addInterceptor(std::shared_ptr<Interceptor> interceptor);
  64. void removeInterceptor(std::shared_ptr<Interceptor> interceptor);
  65. void clearInterceptors();
  66. // 基础URL设置
  67. void setBaseUrl(const QString& url) { m_baseUrl = url; }
  68. QString baseUrl() const { return m_baseUrl; }
  69. void setTimeout(int timeout) { m_timeout = timeout; }
  70. int timeout() const { return m_timeout; }
  71. // 同步请求
  72. HttpResponse get(const QString& url, const QVariantMap& params = {});
  73. HttpResponse post(const QString& url, const QJsonDocument& data = {});
  74. HttpResponse put(const QString& url, const QJsonDocument& data = {});
  75. HttpResponse deleteResource(const QString& url);
  76. HttpResponse upload(const QString& url, QHttpMultiPart* multiPart);
  77. // 异步请求
  78. QFuture<HttpResponse> getAsync(const QString& url, const QVariantMap& params = {});
  79. QFuture<HttpResponse> postAsync(const QString& url, const QJsonDocument& data = {});
  80. QFuture<HttpResponse> putAsync(const QString& url, const QJsonDocument& data = {});
  81. QFuture<HttpResponse> deleteAsync(const QString& url);
  82. QFuture<HttpResponse> uploadAsync(const QString& url, QHttpMultiPart* multiPart);
  83. // 文件下载
  84. bool download(const QString& url, const QString& saveFilePath);
  85. QFuture<bool> downloadAsync(const QString& url, const QString& saveFilePath);
  86. signals:
  87. void requestStarted(const QUrl& url);
  88. void requestFinished(const QUrl& url, const HttpResponse& response);
  89. void requestFailed(const QUrl& url, const QString& error);
  90. private:
  91. struct RequestContext
  92. {
  93. QNetworkReply* reply = nullptr;
  94. QByteArray responseData;
  95. bool handled = false;
  96. };
  97. // 内部实现方法
  98. QNetworkReply* sendGetRequest(const QString& url, const QVariantMap& params);
  99. QNetworkReply* sendPostRequest(const QString& url, const QJsonDocument& data);
  100. QNetworkReply* sendPutRequest(const QString& url, const QJsonDocument& data);
  101. QNetworkReply* sendDeleteRequest(const QString& url);
  102. QNetworkReply* sendUploadRequest(const QString& url, QHttpMultiPart* multiPart);
  103. void processRequest(QNetworkRequest& request);
  104. void processResponse(QNetworkReply* reply);
  105. HttpResponse parseReplyData(QNetworkReply* reply);
  106. QByteArray readReplyData(QNetworkReply* reply);
  107. void cacheReplyData(QNetworkReply* reply, const QByteArray& data);
  108. void setupDefaultInterceptors();
  109. QString m_baseUrl;
  110. int m_timeout = 10000;
  111. QSharedPointer<NetworkAccessManager> m_networkManager;
  112. QList<std::shared_ptr<Interceptor>> m_interceptors;
  113. QMutex m_interceptorMutex;
  114. };
  115. // 认证请求拦截器
  116. class AuthRequestInterceptor : public Interceptor
  117. {
  118. public:
  119. void interceptRequest(QNetworkRequest& request) override;
  120. void interceptResponse(QNetworkReply* reply) override;
  121. };
  122. // 错误响应拦截器
  123. class ErrorResponseInterceptor : public Interceptor
  124. {
  125. public:
  126. void interceptRequest(QNetworkRequest& request) override {}
  127. void interceptResponse(QNetworkReply* reply) override;
  128. };
  129. } // namespace TC
  130. #endif // NETWORKACCESSMANAGER_H