request.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. import Vue from 'vue';
  2. import { popAll } from './formId.js';
  3. import {platform} from './config.js';
  4. import apiUrl from './apiUrl.js';
  5. import { objectValues } from './utils.js';
  6. import $store from '../store/index.js';
  7. const request = async function (args) {
  8. const header = {
  9. 'X-App-Platform': (args.header && args.header['X-App-Platform']) ? args.header['X-App-Platform'] : platform,
  10. 'X-Form-Id-List': JSON.stringify(popAll()),
  11. 'X-Requested-With': (args.header && args.header['X-Requested-With']) ? args.header['X-Requested-With'] : 'XMLHttpRequest',
  12. 'X-App-Version': Vue.prototype.$appVersion,
  13. 'content-type': 'application/x-www-form-urlencoded'
  14. };
  15. await $store.dispatch('user/loadAccessTokenFormCache');
  16. if ($store.state.user && $store.state.user.accessToken) {
  17. header['X-Access-Token'] = $store.state.user.accessToken;
  18. }
  19. if ($store.state.user && $store.state.user.tempParentId !== 0) {
  20. header['X-User-Id'] = $store.state.user.tempParentId + '';
  21. }
  22. //多商户Token
  23. let obj = {};
  24. args.url.replace(/([^=&]+)=([^&]*)/g, function (m, key, value) {
  25. obj[decodeURIComponent(key)] = decodeURIComponent(value);
  26. });
  27. if (objectValues(apiUrl.mch).indexOf(obj.r) !== -1) {
  28. const mch_storage = uni.getStorageSync('MCH2019');
  29. header['Mch-Access-Token'] = mch_storage.token;
  30. }
  31. const [error, response] = await uni.request({
  32. url: args.url,
  33. method: args.method || 'get',
  34. data: args.data,
  35. header: header,
  36. });
  37. if (error) {
  38. let msg = {
  39. code: 400,
  40. msg: error.errMsg,
  41. data: error,
  42. };
  43. alertError(msg);
  44. return Promise.reject(msg);
  45. } else {
  46. return distinguishStatusCode(response);
  47. }
  48. };
  49. // #ifndef MP-ALIPAY
  50. const reloadPage = function () {
  51. let pages = getCurrentPages();
  52. let page = pages[pages.length - 1];
  53. let options = page.options || {};
  54. let route = page.route || '';
  55. if (route.indexOf('/') !== 0) {
  56. route = '/' + route;
  57. }
  58. let query = '';
  59. for (let k in options) {
  60. query = query + `${k}=${options[k]}&`;
  61. }
  62. uni.redirectTo({
  63. url: route + (query ? `?${query}` : ``),
  64. });
  65. };
  66. // #endif
  67. const alertError = function (error) {
  68. let confirmText = '刷新页面';
  69. // #ifdef MP-ALIPAY
  70. confirmText = '确认';
  71. // #endif
  72. uni.showModal({
  73. title: '网络错误',
  74. content: '网络开了小差,请刷新重试下哦~',
  75. cancelText: '复制错误',
  76. confirmText: confirmText,
  77. success: (e) => {
  78. if (e.cancel) {
  79. let data = `code: ${error.code}, \r\nmsg: ${error.msg}, \r\ndetail: `
  80. + (error.data ? (typeof error.data === 'string' ? error.data : JSON.stringify(error.data)) : null);
  81. uni.setClipboardData({
  82. data: data,
  83. fail(e) {
  84. console.log('错误复制失败', e);
  85. },
  86. });
  87. }
  88. if (e.confirm) {
  89. // #ifndef MP-ALIPAY
  90. reloadPage();
  91. // #endif
  92. }
  93. },
  94. });
  95. };
  96. const distinguishDataCode = function (response) {
  97. if (response.data) {
  98. let {msg, code} = response.data;
  99. if (code >= 400) {
  100. alertError({
  101. code: code,
  102. msg: msg,
  103. data: response.data.error || (response.data.data || msg),
  104. });
  105. return Promise.reject(msg);
  106. } else if (code === -1) {
  107. $store.dispatch('user/logout');
  108. $store.dispatch('user/accessToken');
  109. return Promise.reject(msg);
  110. } else if (code === -2) {
  111. uni.redirectTo({
  112. url: '/pages/disabled/disabled?text=' + response.data.data.text
  113. });
  114. } else if (code === -3) {
  115. uni.redirectTo({
  116. url: '/plugins/mch/mch/login/login'
  117. });
  118. return Promise.reject(msg);
  119. } else {
  120. return Promise.resolve(response.data);
  121. }
  122. } else {
  123. return Promise.reject({
  124. code: 200,
  125. msg: '数据不存在',
  126. data: response,
  127. });
  128. }
  129. };
  130. const distinguishStatusCode = function (response) {
  131. let msg = {
  132. code: 500,
  133. msg: '服务器内部错误',
  134. data: response,
  135. };
  136. switch (response.statusCode) {
  137. case 200:
  138. return distinguishDataCode(response);
  139. case 404:
  140. msg = {
  141. code: 404,
  142. msg: '资源获取不到',
  143. data: response,
  144. };
  145. break;
  146. case 500:
  147. msg = {
  148. code: 500,
  149. msg: '服务器内部错误',
  150. data: response,
  151. };
  152. break;
  153. case 503:
  154. msg = {
  155. code: 503,
  156. msg: '服务不可用',
  157. data: response,
  158. };
  159. break;
  160. case 504:
  161. msg = {
  162. code: 504,
  163. msg: '网关超时',
  164. data: response,
  165. };
  166. break;
  167. case 400:
  168. msg = {
  169. code: 400,
  170. msg: '服务器不理解请求的语法',
  171. data: response,
  172. };
  173. break;
  174. case 403:
  175. msg = {
  176. code: 403,
  177. msg: '服务器拒绝请求',
  178. data: response,
  179. };
  180. break;
  181. case 405:
  182. msg = {
  183. code: 405,
  184. msg: '方法禁用',
  185. data: response,
  186. };
  187. break;
  188. case 406:
  189. msg = {
  190. code: 406,
  191. msg: '无法使用请求的内容特性响应请求的网页',
  192. data: response,
  193. };
  194. break;
  195. case 407:
  196. msg = {
  197. code: 407,
  198. msg: '需要代理授权',
  199. data: response,
  200. };
  201. break;
  202. case 408:
  203. msg = {
  204. code: 408,
  205. msg: '请求超时',
  206. data: response,
  207. };
  208. break;
  209. case 409:
  210. msg = {
  211. code: 409,
  212. msg: '冲突',
  213. data: response,
  214. };
  215. break;
  216. case 410:
  217. msg = {
  218. code: 410,
  219. msg: '已删除',
  220. data: response,
  221. };
  222. break;
  223. case 411:
  224. msg = {
  225. code: 411,
  226. msg: '需要有效长度',
  227. data: response,
  228. };
  229. break;
  230. case 412:
  231. msg = {
  232. code: 412,
  233. msg: '服务器未满足请求者在请求中设置的其中一个前提条件',
  234. data: response,
  235. };
  236. break;
  237. case 413:
  238. msg = {
  239. code: 413,
  240. msg: '请求实体过大',
  241. data: response,
  242. };
  243. break;
  244. case 414:
  245. msg = {
  246. code: 414,
  247. msg: '求情URI过长',
  248. data: response,
  249. };
  250. break;
  251. case 415:
  252. msg = {
  253. code: 415,
  254. msg: '不支持的媒体类型',
  255. data: response,
  256. };
  257. break;
  258. case 416:
  259. msg = {
  260. code: 416,
  261. msg: '请求范围不符合要求',
  262. data: response,
  263. };
  264. break;
  265. case 417:
  266. msg = {
  267. code: 417,
  268. msg: '未满足期望值',
  269. data: response,
  270. };
  271. break;
  272. default:
  273. break;
  274. }
  275. alertError(msg);
  276. return Promise.reject(msg);
  277. };
  278. export default request;