networkaccessmanager.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. #include "networkaccessmanager.h"
  2. #include "appevent.h"
  3. #include <QBuffer>
  4. #include <QCoreApplication>
  5. #include <QEventLoop>
  6. #include <QFile>
  7. #include <QJsonDocument>
  8. #include <QJsonObject>
  9. #include <QUrlQuery>
  10. // 基础URL配置
  11. static QString base_url("http://127.0.0.1:8888/api");
  12. static NetworkAccessManager* namInstance = nullptr;
  13. void cleanupNetworkAccessManager()
  14. {
  15. delete namInstance;
  16. namInstance = nullptr;
  17. }
  18. NetworkAccessManager* NetworkAccessManager::instance()
  19. {
  20. if (!namInstance) {
  21. namInstance = new NetworkAccessManager;
  22. qAddPostRoutine(cleanupNetworkAccessManager);
  23. }
  24. return namInstance;
  25. }
  26. NetworkAccessManager::NetworkAccessManager(QObject* parent)
  27. : QNetworkAccessManager(parent)
  28. {}
  29. QNetworkReply* NetworkAccessManager::createRequest(Operation op,
  30. const QNetworkRequest& request,
  31. QIODevice* outgoingData)
  32. {
  33. QNetworkRequest req(request);
  34. // 记录请求开始时间
  35. QDateTime startTime = QDateTime::currentDateTime();
  36. // 获取操作类型字符串
  37. QString opStr;
  38. switch (op) {
  39. case QNetworkAccessManager::GetOperation:
  40. opStr = "GET";
  41. break;
  42. case QNetworkAccessManager::PostOperation:
  43. opStr = "POST";
  44. break;
  45. case QNetworkAccessManager::PutOperation:
  46. opStr = "PUT";
  47. break;
  48. case QNetworkAccessManager::DeleteOperation:
  49. opStr = "DELETE";
  50. break;
  51. case QNetworkAccessManager::HeadOperation:
  52. opStr = "HEAD";
  53. break;
  54. default:
  55. opStr = "UNKNOWN";
  56. break;
  57. }
  58. qDebug() << QString("[%1] --> %2 %3")
  59. .arg(startTime.toString("yyyy-MM-dd hh:mm:ss.zzz"))
  60. .arg(opStr)
  61. .arg(request.url().toString());
  62. // 默认的请求处理
  63. QString agentStr = QString::fromLatin1("%1/%2 (QNetworkAccessManager %3; %4; %5; %6 bit)")
  64. .arg(QCoreApplication::applicationName(),
  65. QCoreApplication::applicationVersion(),
  66. QLatin1String(qVersion()),
  67. QSysInfo::prettyProductName(),
  68. QLocale::system().name())
  69. .arg(QSysInfo::WordSize);
  70. req.setRawHeader("User-Agent", agentStr.toLatin1());
  71. const QString token = AppEvent::instance()->jwtToken();
  72. if (!token.isEmpty()) {
  73. req.setRawHeader("Authorization", "Bearer " + token.toUtf8());
  74. }
  75. req.setRawHeader("Machine-Code", AppEvent::instance()->machineCode().toUtf8());
  76. req.setRawHeader("Accept-Language", AppEvent::instance()->locale().toUtf8());
  77. const QUrl& url = request.url();
  78. const QString urlPath = url.path();
  79. if (!urlPath.contains("/api/auth/refresh-token") && !urlPath.contains("/api/auth/login")) {
  80. if (AppEvent::instance()->isRefreshToken()) {
  81. emit AppEvent::instance()->refreshTokenNeeded();
  82. }
  83. }
  84. QNetworkReply* reply
  85. = QNetworkAccessManager::createRequest(op,
  86. req,
  87. outgoingData); // 存储开始时间,用于计算请求耗时
  88. reply->setProperty("startTime", startTime);
  89. return reply;
  90. }
  91. namespace TC {
  92. // 认证请求拦截器
  93. class AuthRequestInterceptor : public Interceptor
  94. {
  95. public:
  96. void interceptRequest(QNetworkRequest& request) override;
  97. };
  98. // 认证响应拦截器
  99. class AuthResponseInterceptor : public Interceptor
  100. {
  101. public:
  102. void interceptResponse(QNetworkReply* reply) override;
  103. private:
  104. void doRefreshToken();
  105. void doReAuthenticate();
  106. };
  107. // 错误响应拦截器
  108. class ErrorResponseInterceptor : public Interceptor
  109. {
  110. public:
  111. void interceptResponse(QNetworkReply* reply) override;
  112. };
  113. // 请求客户端实现
  114. RequestClient::RequestClient(const RequestClientOptions& options)
  115. : m_baseUrl(options.baseURL)
  116. {
  117. // 初始化默认拦截器
  118. if (options.enableDefaultInterceptors) {
  119. setupDefaultInterceptors();
  120. }
  121. }
  122. RequestClient* RequestClient::createClient(const QString& baseURL,
  123. const RequestClientOptions& options)
  124. {
  125. RequestClientOptions opts = options;
  126. opts.baseURL = baseURL;
  127. return new RequestClient(opts);
  128. }
  129. void RequestClient::setupDefaultInterceptors()
  130. {
  131. // 添加认证拦截器
  132. auto authRequestInterceptor = new AuthRequestInterceptor();
  133. addInterceptor(authRequestInterceptor);
  134. // 添加响应拦截器
  135. auto authResponseInterceptor = new AuthResponseInterceptor();
  136. addInterceptor(authResponseInterceptor);
  137. // 添加错误处理拦截器
  138. auto errorInterceptor = new ErrorResponseInterceptor();
  139. addInterceptor(errorInterceptor);
  140. }
  141. void RequestClient::addInterceptor(Interceptor* interceptor)
  142. {
  143. if (!interceptors.contains(interceptor)) {
  144. interceptors.append(interceptor);
  145. }
  146. }
  147. void RequestClient::removeInterceptor(Interceptor* interceptor)
  148. {
  149. interceptors.removeOne(interceptor);
  150. }
  151. void RequestClient::setBaseUrl(const QString& url)
  152. {
  153. m_baseUrl = url;
  154. }
  155. QString RequestClient::baseUrl() const
  156. {
  157. return m_baseUrl;
  158. }
  159. void RequestClient::setTimeout(int timeout)
  160. {
  161. m_timeout = timeout;
  162. }
  163. int RequestClient::timeout() const
  164. {
  165. return m_timeout;
  166. }
  167. QNetworkReply* RequestClient::getSync(const QString& url, const QVariantMap& params)
  168. {
  169. QNetworkReply* reply = get(url, params);
  170. // 同步等待
  171. QEventLoop loop;
  172. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  173. loop.exec();
  174. // 处理响应拦截器
  175. processResponse(reply);
  176. return reply;
  177. }
  178. QNetworkReply* RequestClient::postSync(const QString& url, const QJsonDocument& data)
  179. {
  180. QNetworkReply* reply = post(url, data);
  181. // 同步等待
  182. QEventLoop loop;
  183. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  184. loop.exec();
  185. // 处理响应拦截器
  186. processResponse(reply);
  187. return reply;
  188. }
  189. QNetworkReply* RequestClient::putSync(const QString& url, const QJsonDocument& data)
  190. {
  191. QNetworkReply* reply = put(url, data);
  192. // 同步等待
  193. QEventLoop loop;
  194. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  195. loop.exec();
  196. // 处理响应拦截器
  197. processResponse(reply);
  198. return reply;
  199. }
  200. QNetworkReply* RequestClient::deleteSync(const QString& url)
  201. {
  202. QNetworkReply* reply = deleteResource(url);
  203. // 同步等待
  204. QEventLoop loop;
  205. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  206. loop.exec();
  207. // 处理响应拦截器
  208. processResponse(reply);
  209. return reply;
  210. }
  211. QNetworkReply* RequestClient::uploadSync(const QString& url, QHttpMultiPart* multiPart)
  212. {
  213. QNetworkReply* reply = upload(url, multiPart);
  214. // 同步等待
  215. QEventLoop loop;
  216. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  217. loop.exec();
  218. // 处理响应拦截器
  219. processResponse(reply);
  220. return reply;
  221. }
  222. QFuture<HttpResponse> RequestClient::getAsync(const QString& url, const QVariantMap& params)
  223. {
  224. QFutureInterface<HttpResponse> interface;
  225. interface.reportStarted();
  226. QNetworkReply* reply = get(url, params);
  227. setupAsyncConnections(reply, interface);
  228. return interface.future();
  229. }
  230. QFuture<HttpResponse> RequestClient::postAsync(const QString& url, const QJsonDocument& data)
  231. {
  232. QFutureInterface<HttpResponse> interface;
  233. interface.reportStarted();
  234. QNetworkReply* reply = post(url, data);
  235. setupAsyncConnections(reply, interface);
  236. return interface.future();
  237. }
  238. QFuture<HttpResponse> RequestClient::putAsync(const QString& url, const QJsonDocument& data)
  239. {
  240. QFutureInterface<HttpResponse> interface;
  241. interface.reportStarted();
  242. QNetworkReply* reply = put(url, data);
  243. setupAsyncConnections(reply, interface);
  244. return interface.future();
  245. }
  246. QFuture<HttpResponse> RequestClient::deleteAsync(const QString& url)
  247. {
  248. QFutureInterface<HttpResponse> interface;
  249. interface.reportStarted();
  250. QNetworkReply* reply = deleteResource(url);
  251. setupAsyncConnections(reply, interface);
  252. return interface.future();
  253. }
  254. QFuture<HttpResponse> RequestClient::uploadAsync(const QString& url, QHttpMultiPart* multiPart)
  255. {
  256. QFutureInterface<HttpResponse> interface;
  257. interface.reportStarted();
  258. QNetworkReply* reply = upload(url, multiPart);
  259. setupAsyncConnections(reply, interface);
  260. return interface.future();
  261. }
  262. HttpResponse RequestClient::parseReplyData(QNetworkReply* reply)
  263. {
  264. HttpResponse response;
  265. if (reply->error() != QNetworkReply::NoError) {
  266. response.code = reply->error();
  267. response.message = reply->errorString();
  268. return response;
  269. }
  270. QByteArray responseData = reply->readAll();
  271. QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData);
  272. if (jsonDoc.isObject()) {
  273. const QJsonObject jsonObj = jsonDoc.object();
  274. if (jsonObj.contains("code")) {
  275. response.code = jsonObj["code"].toInt();
  276. }
  277. if (jsonObj.contains("message")) {
  278. response.message = jsonObj["message"].toString();
  279. }
  280. if (jsonObj.contains("data")) {
  281. QJsonValue dataValue = jsonObj["data"];
  282. response.data = dataValue;
  283. }
  284. }
  285. return response;
  286. }
  287. void RequestClient::processRequest(QNetworkRequest& request)
  288. {
  289. for (auto interceptor : interceptors) {
  290. interceptor->interceptRequest(request);
  291. }
  292. }
  293. void RequestClient::processResponse(QNetworkReply* reply)
  294. {
  295. for (auto interceptor : interceptors) {
  296. interceptor->interceptResponse(reply);
  297. }
  298. }
  299. QNetworkReply* RequestClient::get(const QString& url, const QVariantMap& params)
  300. {
  301. QNetworkAccessManager* manager = NetworkAccessManager::instance();
  302. manager->setTransferTimeout(m_timeout);
  303. QUrl fullUrl(m_baseUrl.isEmpty() ? QString(base_url).append(url) : m_baseUrl.append(url));
  304. QUrlQuery query;
  305. for (auto it = params.constBegin(); it != params.constEnd(); ++it) {
  306. query.addQueryItem(it.key(), it.value().toString());
  307. }
  308. if (!params.isEmpty()) {
  309. fullUrl.setQuery(query);
  310. }
  311. QNetworkRequest modifiedRequest(fullUrl);
  312. modifiedRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  313. processRequest(modifiedRequest);
  314. QNetworkReply* reply = manager->get(modifiedRequest);
  315. return reply;
  316. }
  317. QNetworkReply* RequestClient::post(const QString& url, const QJsonDocument& data)
  318. {
  319. QNetworkAccessManager* manager = NetworkAccessManager::instance();
  320. manager->setTransferTimeout(m_timeout);
  321. QUrl fullUrl(m_baseUrl.isEmpty() ? QString(base_url).append(url) : m_baseUrl.append(url));
  322. QBuffer* buffer = new QBuffer;
  323. buffer->setData(data.toJson());
  324. buffer->open(QIODevice::ReadOnly);
  325. QNetworkRequest modifiedRequest(fullUrl);
  326. modifiedRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
  327. processRequest(modifiedRequest);
  328. QNetworkReply* reply = manager->post(modifiedRequest, buffer);
  329. buffer->setParent(reply);
  330. return reply;
  331. }
  332. QNetworkReply* RequestClient::put(const QString& url, const QJsonDocument& data)
  333. {
  334. QNetworkAccessManager* manager = NetworkAccessManager::instance();
  335. manager->setTransferTimeout(m_timeout);
  336. QUrl fullUrl(m_baseUrl.isEmpty() ? QString(base_url).append(url) : m_baseUrl.append(url));
  337. QBuffer* buffer = new QBuffer;
  338. buffer->setData(data.toJson());
  339. buffer->open(QIODevice::ReadOnly);
  340. QNetworkRequest modifiedRequest(fullUrl);
  341. processRequest(modifiedRequest);
  342. QNetworkReply* reply = manager->put(modifiedRequest, buffer);
  343. buffer->setParent(reply);
  344. return reply;
  345. }
  346. QNetworkReply* RequestClient::deleteResource(const QString& url)
  347. {
  348. QNetworkAccessManager* manager = NetworkAccessManager::instance();
  349. manager->setTransferTimeout(m_timeout);
  350. QUrl fullUrl(m_baseUrl.isEmpty() ? QString(base_url).append(url) : m_baseUrl.append(url));
  351. QNetworkRequest modifiedRequest(fullUrl);
  352. processRequest(modifiedRequest);
  353. QNetworkReply* reply = manager->deleteResource(modifiedRequest);
  354. return reply;
  355. }
  356. QNetworkReply* RequestClient::upload(const QString& url, QHttpMultiPart* multiPart)
  357. {
  358. QNetworkAccessManager* manager = NetworkAccessManager::instance();
  359. manager->setTransferTimeout(m_timeout);
  360. QUrl fullUrl(m_baseUrl.isEmpty() ? QString(base_url).append(url) : m_baseUrl.append(url));
  361. QNetworkRequest modifiedRequest(fullUrl);
  362. QNetworkReply* reply = manager->post(modifiedRequest, multiPart);
  363. return reply;
  364. }
  365. bool RequestClient::download(const QString& url, const QString& saveFilePath)
  366. {
  367. QNetworkReply* reply = get(url);
  368. QEventLoop loop;
  369. QFile file(saveFilePath);
  370. if (!file.open(QIODevice::WriteOnly)) {
  371. return false;
  372. }
  373. QObject::connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
  374. QObject::connect(reply, &QNetworkReply::readyRead, [&]() { file.write(reply->readAll()); });
  375. loop.exec();
  376. file.close();
  377. return reply->error() == QNetworkReply::NoError;
  378. }
  379. void RequestClient::setupAsyncConnections(QNetworkReply* reply,
  380. QFutureInterface<HttpResponse>& _interface)
  381. { // 处理网络错误信号
  382. QObject::connect(reply,
  383. &QNetworkReply::errorOccurred,
  384. [this, reply, _interface](QNetworkReply::NetworkError error) mutable {
  385. // 避免重复处理
  386. if (reply->property("handled").toBool()) {
  387. return;
  388. }
  389. reply->setProperty("handled", true);
  390. this->processResponse(reply);
  391. HttpResponse errorResponse;
  392. errorResponse.code = error;
  393. errorResponse.message = reply->errorString();
  394. // 特殊处理网络错误类型
  395. if (error == QNetworkReply::OperationCanceledError) {
  396. errorResponse.message = "请求被取消";
  397. } else if (error == QNetworkReply::TimeoutError) {
  398. errorResponse.message = "请求超时";
  399. } else if (error == QNetworkReply::ConnectionRefusedError) {
  400. errorResponse.message = "连接被拒绝";
  401. } else if (error == QNetworkReply::HostNotFoundError) {
  402. errorResponse.message = "找不到主机";
  403. }
  404. _interface.reportResult(errorResponse);
  405. _interface.reportFinished();
  406. });
  407. // 处理完成信号
  408. QObject::connect(reply, &QNetworkReply::finished, [this, reply, _interface]() mutable {
  409. // 避免重复处理
  410. if (reply->property("handled").toBool()) {
  411. reply->deleteLater();
  412. return;
  413. }
  414. reply->setProperty("handled", true);
  415. processResponse(reply);
  416. try {
  417. // 即使在 finished 信号中,也需要检查是否有错误
  418. if (reply->error() != QNetworkReply::NoError) {
  419. HttpResponse errorResponse;
  420. errorResponse.code = reply->error();
  421. errorResponse.message = reply->errorString();
  422. _interface.reportResult(errorResponse);
  423. } else {
  424. HttpResponse response = parseReplyData(reply);
  425. _interface.reportResult(response);
  426. }
  427. _interface.reportFinished();
  428. } catch (const std::exception& e) {
  429. HttpResponse errorResponse;
  430. errorResponse.code = -1;
  431. errorResponse.message = QString::fromUtf8(e.what());
  432. _interface.reportResult(errorResponse);
  433. _interface.reportFinished();
  434. }
  435. reply->deleteLater();
  436. });
  437. }
  438. // 拦截器实现
  439. void AuthRequestInterceptor::interceptRequest(QNetworkRequest& request)
  440. {
  441. const QString token = AppEvent::instance()->jwtToken();
  442. if (!token.isEmpty()) {
  443. request.setRawHeader("Authorization", "Bearer " + token.toUtf8());
  444. }
  445. request.setRawHeader("Machine-Code", AppEvent::instance()->machineCode().toUtf8());
  446. request.setRawHeader("Accept-Language", AppEvent::instance()->locale().toUtf8());
  447. }
  448. void AuthResponseInterceptor::interceptResponse(QNetworkReply* reply)
  449. {
  450. // 检查是否需要刷新token
  451. if (reply->error() == QNetworkReply::AuthenticationRequiredError) {
  452. // 触发token刷新
  453. emit AppEvent::instance()->refreshTokenNeeded();
  454. // 如果启用了自动刷新token,可以在这里实现
  455. if (AppEvent::instance()->isEnableRefreshToken()) {
  456. doRefreshToken();
  457. } else {
  458. doReAuthenticate();
  459. }
  460. }
  461. }
  462. void AuthResponseInterceptor::doRefreshToken()
  463. {
  464. // 实现刷新token的逻辑
  465. RequestClient refreshClient;
  466. QJsonObject emptyData;
  467. QJsonDocument jsonDoc(emptyData);
  468. QNetworkReply* reply = refreshClient.postSync("/api/auth/refresh-token", jsonDoc);
  469. if (reply->error() == QNetworkReply::NoError) {
  470. QByteArray responseData = reply->readAll();
  471. QJsonDocument jsonResponse = QJsonDocument::fromJson(responseData);
  472. QJsonObject jsonObject = jsonResponse.object();
  473. if (jsonObject.contains("data")) {
  474. QString newToken = jsonObject["data"].toString();
  475. AppEvent::instance()->setJwtToken(newToken);
  476. }
  477. } else {
  478. // 刷新失败,需要重新登录
  479. doReAuthenticate();
  480. }
  481. reply->deleteLater();
  482. }
  483. void AuthResponseInterceptor::doReAuthenticate()
  484. {
  485. // 实现重新认证的逻辑
  486. AppEvent::instance()->setJwtToken("");
  487. emit AppEvent::instance()->loginExpired(true);
  488. }
  489. void ErrorResponseInterceptor::interceptResponse(QNetworkReply* reply)
  490. {
  491. if (reply->error() != QNetworkReply::NoError) {
  492. // 解析错误信息
  493. QByteArray responseData = reply->readAll();
  494. QString errorMessage;
  495. try {
  496. QJsonDocument jsonResponse = QJsonDocument::fromJson(responseData);
  497. QJsonObject jsonObject = jsonResponse.object();
  498. if (jsonObject.contains("error")) {
  499. errorMessage = jsonObject["error"].toString();
  500. } else if (jsonObject.contains("message")) {
  501. errorMessage = jsonObject["message"].toString();
  502. }
  503. } catch (...) {
  504. // 解析失败,使用默认错误信息
  505. }
  506. if (errorMessage.isEmpty()) {
  507. errorMessage = reply->errorString();
  508. }
  509. // 发送错误信息
  510. emit AppEvent::instance()->errorMessage(errorMessage);
  511. // 可以根据不同的错误类型进行不同的处理
  512. switch (reply->error()) {
  513. case QNetworkReply::ConnectionRefusedError:
  514. qDebug() << "连接被拒绝" << errorMessage;
  515. break;
  516. case QNetworkReply::RemoteHostClosedError:
  517. qDebug() << "远程主机关闭连接" << errorMessage;
  518. break;
  519. case QNetworkReply::HostNotFoundError:
  520. qDebug() << "主机未找到" << errorMessage;
  521. break;
  522. case QNetworkReply::TimeoutError:
  523. qDebug() << "连接超时" << errorMessage;
  524. break;
  525. case QNetworkReply::OperationCanceledError:
  526. qDebug() << "操作被取消" << errorMessage;
  527. break;
  528. case QNetworkReply::SslHandshakeFailedError:
  529. qDebug() << "SSL握手失败" << errorMessage;
  530. break;
  531. case QNetworkReply::TemporaryNetworkFailureError:
  532. qDebug() << "临时网络故障" << errorMessage;
  533. break;
  534. case QNetworkReply::NetworkSessionFailedError:
  535. qDebug() << "网络会话失败" << errorMessage;
  536. break;
  537. case QNetworkReply::BackgroundRequestNotAllowedError:
  538. qDebug() << "不允许后台请求" << errorMessage;
  539. break;
  540. case QNetworkReply::ContentReSendError:
  541. qDebug() << "内容重发错误" << errorMessage;
  542. break;
  543. default:
  544. qDebug() << "其他网络错误" << errorMessage;
  545. break;
  546. }
  547. }
  548. }
  549. // 创建全局客户端实例
  550. static RequestClient* requestClientInstance = nullptr;
  551. static RequestClient* baseRequestClientInstance = nullptr;
  552. RequestClient* RequestClient::requestClient(const RequestClientOptions& defaultOptions)
  553. {
  554. if (!requestClientInstance) {
  555. RequestClientOptions options = defaultOptions;
  556. options.enableDefaultInterceptors = true;
  557. options.responseReturn = "data";
  558. requestClientInstance = createClient(options.baseURL, options);
  559. }
  560. return requestClientInstance;
  561. }
  562. RequestClient* RequestClient::baseRequestClient(const RequestClientOptions& defaultOptions)
  563. {
  564. if (!baseRequestClientInstance) {
  565. RequestClientOptions options = defaultOptions;
  566. options.enableDefaultInterceptors = false;
  567. options.responseReturn = "data";
  568. baseRequestClientInstance = createClient(options.baseURL, options);
  569. }
  570. return baseRequestClientInstance;
  571. }
  572. } // namespace TC