networkaccessmanager.h 4.8 KB

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