vk.request.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. var requestUtil = {};
  2. requestUtil.config = {
  3. // 请求配置
  4. request: {
  5. // 公共请求参数(每次请求都会带上的参数)
  6. dataParam: {}
  7. },
  8. requestGlobalParamKeyName: "vk_url_request_global_param",
  9. debug: process.env.NODE_ENV !== "production",
  10. // 日志风格
  11. logger: {
  12. colorArr: [
  13. "#0095ff",
  14. "#67C23A"
  15. ]
  16. },
  17. };
  18. var counterNum = 0;
  19. /**
  20. * request 请求库
  21. * 注意: 该请求库目前主要是框架自身使用,且近期变动频率较高,目前请勿使用在你自己的业务中。
  22. * @param {String} url 服务器接口地址
  23. * @param {Object/String/ArrayBuffer} data 请求的参数 App(自定义组件编译模式)不支持ArrayBuffer类型
  24. * @param {Object} header 设置请求的 header,header 中不能设置 Referer。 App、H5端会自动带上cookie,且H5端不可手动修改
  25. * @param {String} method 默认 POST 可选 GET
  26. * @param {Number} timeout 超时时间,单位 ms 默认3000(30秒)
  27. * @param {String} dataType 默认json 如果设为 json,会尝试对返回的数据做一次 JSON.parse
  28. * @param {String} responseType 默认 text 设置响应的数据类型。合法值:text、arraybuffer App和支付宝小程序不支持
  29. * @param {Boolean} sslVerify 默认 true 是否需要验证ssl证书 仅App安卓端支持(HBuilderX 2.3.3+) 仅App安卓端支持(HBuilderX 2.3.3+)
  30. * @param {Boolean} withCredentials 默认 false 跨域请求时是否携带凭证(cookies) 仅H5支持(HBuilderX 2.6.15+)
  31. * @param {Boolean} firstIpv4 默认 false DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+)
  32. * @param {String} success 成功回调
  33. * @param {String} fail 失败回调
  34. * @param {String} complete 完成回调
  35. * 以下为特殊参数
  36. * @param {String} errorCodeName 服务器返回的错误码的字段名,若不为空,则会对返回结果进行判断
  37. * @param {String} errorMsgName 服务器返回的错误码的字符串含义,若不为空,且errorCodeName对应的值不为0,则会alert弹窗
  38. * @param {Boolean} needAlert 服务器返回的错误时,是否需要alert弹出提示
  39. *
  40. * 调用示例
  41. vk.request({
  42. url: `https://www.xxx.com/api/xxxx`,
  43. method:"POST",
  44. header:{
  45. "content-type": "application/x-www-form-urlencoded",
  46. },
  47. data:{
  48. },
  49. success: function(data){
  50. },
  51. fail: function(err){
  52. }
  53. });
  54. */
  55. requestUtil.request = function(obj = {}) {
  56. let vk = uni.vk;
  57. // 去除值为 undefined 的参数
  58. if(typeof obj.data === "object"){
  59. obj.data = vk.pubfn.copyObject(obj.data);
  60. }
  61. // 注入自定义全局参数开始-----------------------------------------------------------
  62. let config = requestUtil.config;
  63. let globalParam = uni.getStorageSync(config.requestGlobalParamKeyName) || {};
  64. // 根据正则规格自动匹配全局请求参数
  65. for (let i in globalParam) {
  66. let customDate = globalParam[i];
  67. if (customDate.regExp) {
  68. if (typeof customDate.regExp === "object") {
  69. // 数组形式
  70. for (let i = 0; i < customDate.regExp.length; i++) {
  71. let regExp = new RegExp(customDate.regExp[i]);
  72. if (regExp.test(obj.url)) {
  73. obj.data = Object.assign(customDate.data, obj.data);
  74. break;
  75. }
  76. }
  77. } else {
  78. // 字符串形式
  79. let regExp = new RegExp(customDate.regExp);
  80. if (regExp.test(obj.url)) {
  81. obj.data = Object.assign(customDate.data, obj.data);
  82. }
  83. }
  84. }
  85. }
  86. // 根据指定globalParamName匹配全局请求参数
  87. let customDate = requestUtil.getRequestGlobalParam(obj.globalParamName);
  88. if (customDate && JSON.stringify(customDate) !== "{}") {
  89. if (customDate.regExp) {
  90. obj.data = Object.assign(customDate.data, obj.data); // 新版本
  91. } else {
  92. obj.data = Object.assign(customDate, obj.data); // 兼容旧版本
  93. }
  94. }
  95. // 注入自定义全局参数结束-----------------------------------------------------------
  96. if (!obj.method) obj.method = "POST"; // 默认POST请求
  97. if (typeof obj.dataType === "undefined") obj.dataType = "json";
  98. if (obj.dataType == "default" || obj.dataType === "") delete obj.dataType;
  99. if (typeof obj.header === "undefined" && typeof obj.headers !== "undefined") {
  100. obj.header = obj.headers;
  101. }
  102. if (typeof obj.timeout === "undefined") obj.timeout = 30000; // 超时时间,单位 ms(默认30秒)
  103. let Logger = {};
  104. if (config.debug) {
  105. Logger.params = (typeof obj.data == "object") ? vk.pubfn.copyObject(obj.data) : obj.data;
  106. Logger.startTime = new Date().getTime();
  107. let url = obj.url;
  108. let path = obj.url.split("?")[0];
  109. path = path.substring(path.indexOf("://") + 3);
  110. Logger.domainName = path.substring(0, path.indexOf("/"));
  111. Logger.action = path.substring(path.indexOf("/") + 1);
  112. Logger.url = url;
  113. }
  114. if (obj.title) vk.showLoading(obj.title);
  115. if (obj.loading) vk.setLoading(true, obj.loading);
  116. let promiseAction = new Promise(function(resolve, reject) {
  117. uni.request({
  118. ...obj,
  119. success: function(res) {
  120. requestSuccess({
  121. res,
  122. params: obj,
  123. Logger,
  124. resolve,
  125. reject
  126. });
  127. },
  128. fail: function(res) {
  129. requestFail({
  130. res,
  131. params: obj,
  132. Logger,
  133. reject
  134. });
  135. },
  136. complete: function(res) {
  137. requestComplete({
  138. res,
  139. params: obj,
  140. Logger
  141. });
  142. }
  143. });
  144. });
  145. promiseAction.catch(error => {});
  146. return promiseAction;
  147. }
  148. // 请求成功回调
  149. function requestSuccess(obj = {}) {
  150. let vk = uni.vk;
  151. let config = requestUtil.config;
  152. let {
  153. res = {},
  154. params,
  155. Logger,
  156. resolve,
  157. reject
  158. } = obj;
  159. let {
  160. title,
  161. needOriginalRes,
  162. dataType,
  163. errorCodeName,
  164. errorMsgName,
  165. success,
  166. loading
  167. } = params;
  168. let data = res.data || {};
  169. if (vk.pubfn.isNotNullAll(errorCodeName, data[errorCodeName])) {
  170. data.code = data[errorCodeName];
  171. delete data[errorCodeName];
  172. }
  173. if (vk.pubfn.isNotNullAll(errorMsgName, data[errorMsgName])) {
  174. data.msg = data[errorMsgName];
  175. if(typeof data[errorMsgName] === "string"){
  176. delete data[errorMsgName];
  177. }
  178. }
  179. if (config.debug) Logger.result = (typeof data == "object") ? vk.pubfn.copyObject(data) : data;
  180. if (res.statusCode >= 400 || data.code) {
  181. requestFail({
  182. res: data,
  183. params,
  184. Logger,
  185. reject
  186. });
  187. } else {
  188. if (title) vk.hideLoading();
  189. if (loading) vk.setLoading(false, loading);
  190. if (needOriginalRes) data.originalRes = vk.pubfn.copyObject(res);
  191. if (typeof success === "function") success(data);
  192. if (typeof resolve === "function") resolve(data);
  193. }
  194. }
  195. // 请求失败回调
  196. function requestFail(obj = {}) {
  197. let vk = uni.vk;
  198. let config = requestUtil.config;
  199. let {
  200. res = {},
  201. params,
  202. Logger,
  203. reject
  204. } = obj;
  205. let {
  206. title,
  207. needAlert,
  208. fail,
  209. loading
  210. } = params;
  211. if (typeof needAlert === "undefined") {
  212. needAlert = (typeof fail === "function") ? false : true;
  213. }
  214. let errMsg = "";
  215. let sysErr = false;
  216. if (typeof res.code !== "undefined") {
  217. errMsg = res.msg;
  218. } else {
  219. sysErr = true;
  220. errMsg = JSON.stringify(res);
  221. }
  222. if (errMsg.indexOf("fail timeout") > -1) {
  223. sysErr = true;
  224. errMsg = "请求超时,请重试!";
  225. }
  226. if (config.debug) Logger.error = res;
  227. if (title) vk.hideLoading();
  228. if (loading) vk.setLoading(false, loading);
  229. let runKey = true;
  230. // 自定义拦截器开始-----------------------------------------------------------
  231. let { interceptor={} } = vk.callFunctionUtil.getConfig();
  232. if (interceptor.request && typeof interceptor.request.fail == "function") {
  233. runKey = interceptor.request.fail({
  234. vk,
  235. res: res,
  236. params: params
  237. });
  238. if (runKey === undefined) runKey = true;
  239. }
  240. // 自定义拦截器结束-----------------------------------------------------------
  241. if (runKey) {
  242. if (needAlert && vk.pubfn.isNotNull(errMsg)) {
  243. if (sysErr) {
  244. vk.toast("网络开小差了!", "none");
  245. } else {
  246. vk.alert(errMsg);
  247. }
  248. }
  249. if (typeof fail === "function") fail(res);
  250. if (typeof reject === "function") reject(res);
  251. }
  252. }
  253. // 请求完成回调
  254. function requestComplete(obj = {}) {
  255. let vk = uni.vk;
  256. let config = requestUtil.config;
  257. let {
  258. res = {},
  259. params,
  260. Logger
  261. } = obj;
  262. let {
  263. title,
  264. needOriginalRes,
  265. complete
  266. } = params;
  267. if (config.debug) {
  268. Logger.endTime = new Date().getTime();
  269. Logger.runTime = (Logger.endTime - Logger.startTime);
  270. let colorArr = config.logger.colorArr;
  271. let colorStr = colorArr[counterNum % colorArr.length];
  272. counterNum++;
  273. console.log("%c--------【开始】【服务器请求】【" + Logger.action + "】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
  274. console.log("【请求地址】: ", Logger.url);
  275. console.log("【请求参数】: ", Logger.params);
  276. console.log("【返回数据】: ", Logger.result);
  277. console.log("【请求状态】: ", res.statusCode, "【http状态码】");
  278. console.log("【总体耗时】: ", Logger.runTime, "毫秒【含页面渲染】");
  279. console.log("【请求时间】: ", vk.pubfn.timeFormat(Logger.startTime, "yyyy-MM-dd hh:mm:ss"));
  280. if (Logger.error) {
  281. console.error("【Error】: ", Logger.error);
  282. if (Logger.error.err && Logger.error.err.stack) {
  283. console.error("【Stack】: ", Logger.error.err.stack);
  284. }
  285. }
  286. console.log("%c--------【结束】【服务器请求】【" + Logger.action + "】--------", 'color: ' + colorStr + ';font-size: 12px;font-weight: bold;');
  287. }
  288. let data = res.data;
  289. if (needOriginalRes) data.originalRes = vk.pubfn.copyObject(res);
  290. if (typeof complete === "function") complete(data);
  291. }
  292. /**
  293. * 修改请求配置中的公共请求参数
  294. * 若把shop-manage改成*则代表全局
  295. vk.requestUtil.updateRequestGlobalParam({
  296. "shop-manage":{
  297. regExp:"^xxx/kh/",
  298. data:{
  299. shop_id : shop_id
  300. }
  301. }
  302. });
  303. 对应的request中增加参数globalParamName:"shop-manage"
  304. vk.request({
  305. url: 'xxx/xxxxxx',
  306. title: '请求中...',
  307. globalParamName:"shop-manage",// 如果设置了正则规则,则不需要此参数
  308. data: {},
  309. success(data) {
  310. }
  311. });
  312. */
  313. requestUtil.updateRequestGlobalParam = (data = {}, setKey) => {
  314. let vk = uni.vk;
  315. let config = requestUtil.config;
  316. if (setKey) {
  317. // 覆盖对象
  318. config.request.dataParam = data;
  319. } else {
  320. // 覆盖参数(有就覆盖,没有则新增)
  321. config.request.dataParam = Object.assign(config.request.dataParam, data);
  322. }
  323. vk.setStorageSync(config.requestGlobalParamKeyName, config.request.dataParam);
  324. }
  325. /**
  326. * 获取请求配置中的公共请求参数
  327. vk.requestUtil.getRequestGlobalParam();
  328. */
  329. requestUtil.getRequestGlobalParam = (globalParamName = "*") => {
  330. let vk = uni.vk;
  331. let config = requestUtil.config;
  332. let data = config.request.dataParam;
  333. if (!data || JSON.stringify(data) === "{}") {
  334. data = uni.getStorageSync(config.requestGlobalParamKeyName) || {};
  335. config.request.dataParam = data;
  336. }
  337. let param = data[globalParamName] || {};
  338. return JSON.parse(JSON.stringify(param));
  339. }
  340. /**
  341. * 删除请求配置中的公共请求参数
  342. * globalParamName 不传代表删除所有
  343. vk.requestUtil.deleteRequestGlobalParam(globalParamName);
  344. */
  345. requestUtil.deleteRequestGlobalParam = (globalParamName) => {
  346. let vk = uni.vk;
  347. let config = requestUtil.config;
  348. let globalParam = uni.getStorageSync(config.requestGlobalParamKeyName) || {};
  349. if (globalParamName) {
  350. delete globalParam[globalParamName];
  351. } else {
  352. globalParam = {};
  353. }
  354. config.request.dataParam = globalParam;
  355. vk.setStorageSync(config.requestGlobalParamKeyName, globalParam);
  356. }
  357. export default requestUtil;