request.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import devCache from "../libs/devCache";
  2. import devOptions from "../libs/devOptions";
  3. import jsonCompress from "../libs/jsonCompress";
  4. export default {
  5. /**
  6. * 请求日志示例
  7. */
  8. ajaxLogData: {
  9. id: 0, //请求id
  10. type: 0, // 0发起请求中 1请求成功 2请求失败
  11. sendTime: 0, //发送请求的时间
  12. responseTime: 0, //响应时间
  13. useTime: 0, //请求总耗时
  14. url: "", //请求地址
  15. header: "", //请求头
  16. method: "get", //请求方式
  17. data: "", //请求参数
  18. responseBody: "", //响应主体
  19. responseHeader: "", //响应头
  20. responseStatus: "", //响应编码
  21. responseMsg: "", //响应报错信息
  22. },
  23. options: null,
  24. /**
  25. * 请求的数据列表
  26. */
  27. ajaxData: [],
  28. /**
  29. * 挂载请求拦截器
  30. */
  31. install() {
  32. let that = this;
  33. try {
  34. this.options = devOptions.getOptions()
  35. if (!this.options.network.status) return;
  36. this.ajaxData = devCache.get("request");
  37. if (!this.ajaxData) this.ajaxData = [];
  38. this.syncReqData(); //同步缓存
  39. uni.addInterceptor('request', {
  40. /**
  41. * 入参
  42. */
  43. invoke(args) {
  44. try {
  45. args._id_ = new Date().getTime() + '_' + Number(Math.random().toString().replace("0.", ""));
  46. let copyData = JSON.parse(JSON.stringify(that.ajaxLogData))
  47. copyData.id = args._id_;
  48. copyData.sendTime = new Date().getTime();
  49. copyData.url = that.dataCopy(args.url);
  50. copyData.header = that.dataCopy(args.header);
  51. if (!args.method) {
  52. copyData.method = "get"
  53. } else {
  54. copyData.method = that.dataCopy(args.method);
  55. }
  56. let cSize = jsonCompress.calculateStringByteSize(copyData)
  57. if (cSize > that.options.network.cache.rowSize) {
  58. copyData = jsonCompress.compressObject(copyData, that.options.network.cache.rowSize)
  59. } else {
  60. let data = jsonCompress.compressObject(args.data, that.options.network.cache.rowSize - cSize)
  61. try {
  62. data = JSON.parse(data)
  63. } catch (error) { }
  64. copyData.data = data;
  65. }
  66. that.ajaxData.unshift(copyData)
  67. } catch (error) {
  68. console.error("request拦截器invoke出错", error)
  69. }
  70. },
  71. success(response, request) {
  72. return new Promise(async (yes, err) => {
  73. //! 延迟请求返回,模拟弱网环境
  74. let speedLimit = uni.getStorageSync("devtools_uniResLimitType");
  75. if (speedLimit) {
  76. let delayDuration = {
  77. "2g": [30, 60],
  78. "3g-": [10, 30],
  79. "3g": [3, 10],
  80. "4g": [0.5, 3],
  81. }
  82. let sleepParam = delayDuration[speedLimit];
  83. if (sleepParam) {
  84. let sleepTime = rNum(sleepParam[0], sleepParam[1]);
  85. await sleep(sleepTime * 1000)
  86. response.errMsg = response.errMsg + ` | [devtools模拟弱网延迟:${sleepTime}s]`
  87. }
  88. }
  89. // ! 随机响应失败概率
  90. let resTimeout = uni.getStorageSync("devtools_uniResTimeout");
  91. let isFail = false
  92. if (resTimeout && resTimeout > 1) {
  93. let targetPro = Number(resTimeout);
  94. let randPro = rNum(0, 100);
  95. if (randPro < targetPro) {
  96. // 命中失败
  97. response.statusCode = rNum(400, 600); //生成随机400 ~ 600之间的状态码
  98. response.errMsg = response.errMsg + ` | [devtools随机超时报错,当前命中的概率阶层为:${targetPro}%,生成的随机数为:${randPro}]`
  99. response.data = "[devTools]模拟请求失败结果!"
  100. isFail = true
  101. }
  102. }
  103. // ! 记录响应内容
  104. try {
  105. let item = that.ajaxData.find(x => x.id == request._id_);
  106. if (!item) return;
  107. item.responseBodySize = jsonCompress.calculateStringByteSize(response.data);
  108. item.responseMsg = response.errMsg;
  109. item.responseStatus = response.statusCode;
  110. item.responseHeader = response.header;
  111. item.type = 1;
  112. item.responseTime = new Date().getTime();
  113. item.useTime = ((item.responseTime - item.sendTime) / 1000).toFixed(3);
  114. let size = jsonCompress.calculateStringByteSize(item)
  115. if (size > that.options.network.cache.rowSize) {
  116. item.responseBody = "[内容太长已截断多余部分]"
  117. let data = jsonCompress.compressObject(item, that.options.network.cache.rowSize)
  118. that.ajaxData[that.ajaxData.findIndex(x => x.id == request._id_)] = data;
  119. } else {
  120. let json = response.data;
  121. try {
  122. json = JSON.parse(JSON.stringify(json))
  123. } catch (error) { }
  124. item.responseBody = jsonCompress.compressObject(json, that.options.network.cache.rowSize - size)
  125. }
  126. } catch (error) {
  127. console.error("request拦截器success出错", error)
  128. }
  129. if (isFail) {
  130. err(response.data)
  131. } else {
  132. yes(response)
  133. }
  134. })
  135. },
  136. fail(err, request) {
  137. try {
  138. let item = that.ajaxData.find(x => x.id == request._id_);
  139. if (!item) return;
  140. item.type = 2;
  141. item.responseTime = new Date().getTime();
  142. item.useTime = ((item.responseTime - item.sendTime) / 1000).toFixed(3);
  143. item.responseMsg = err.errMsg;
  144. } catch (error) {
  145. console.error("request拦截器fail出错", error)
  146. }
  147. },
  148. complete(res) {
  149. }
  150. })
  151. // ! 删除指定请求记录
  152. uni.$on("devTools_delNetworkItemById", (id) => {
  153. let i = this.ajaxData.findIndex(x => x.id == id)
  154. if (i != -1) {
  155. this.ajaxData.splice(i, 1)
  156. }
  157. this.saveData()
  158. })
  159. // ! 清空请求记录
  160. uni.$on("devTools_delNetworkAll", () => {
  161. this.ajaxData = []
  162. this.saveData()
  163. })
  164. } catch (error) {
  165. console.log("request.install error", error);
  166. }
  167. },
  168. /**
  169. * 同步请求信息到缓存数据中
  170. */
  171. syncReqData() {
  172. let that = this;
  173. setTimeout(() => {
  174. try {
  175. that.saveData()
  176. } catch (error) {
  177. console.log("request.syncReqData", error);
  178. }
  179. that.syncReqData()
  180. }, 4000);
  181. },
  182. /**
  183. * 保存数据到缓存中
  184. */
  185. saveData() {
  186. let that = this;
  187. that.ajaxData = jsonCompress.compressArray(that.ajaxData, that.options.network.cache.size)
  188. devCache.set("request", that.ajaxData)
  189. },
  190. /**
  191. * 复制对象
  192. */
  193. dataCopy(data) {
  194. try {
  195. if (typeof data == "object") {
  196. return JSON.parse(JSON.stringify([data]))[0]
  197. } else {
  198. return data;
  199. }
  200. } catch (error) {
  201. console.log("request.dataCopy", error);
  202. return ""
  203. }
  204. }
  205. }
  206. /**
  207. * 随机生成n~m的数,支持两位小数
  208. */
  209. function rNum(n, m) {
  210. return Number((Math.random() * (m - n) + n).toFixed(2));
  211. }
  212. /**
  213. * 休眠指定时长
  214. */
  215. function sleep(t) {
  216. return new Promise((y) => {
  217. setTimeout(y, t);
  218. })
  219. }