request.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import { extend } from 'umi-request';
  2. import cleanDeep from 'clean-deep';
  3. import { browser } from '@/helpers/utils';
  4. import { setLogout, setLoginError, state } from '@/state';
  5. import { postMessage } from './native-message';
  6. import { showLoadingToast, showToast, closeToast } from 'vant';
  7. import { storage } from '@/helpers/storage';
  8. import { ACCESS_TOKEN } from '@/store/mutation-types';
  9. export interface SearchInitParams {
  10. rows?: string | number;
  11. page?: string | number;
  12. }
  13. const request = extend({
  14. // requestType: 'form',
  15. hideLoading: true, // 默认都不显示加载
  16. timeout: 20000,
  17. timeoutMessage: '请求超时'
  18. });
  19. // 是否是初始化接口
  20. let initRequest = false;
  21. let toast: ReturnType<typeof setTimeout>;
  22. request.interceptors.request.use(
  23. (url, options: any) => {
  24. if (!options.hideLoading) {
  25. clearTimeout(toast);
  26. showLoadingToast({
  27. message: '加载中...',
  28. forbidClick: true,
  29. duration: 0
  30. });
  31. }
  32. initRequest = options.initRequest || false;
  33. const Authorization = storage.get(ACCESS_TOKEN) || '';
  34. const authHeaders: any = {};
  35. console.log(url);
  36. if (
  37. Authorization &&
  38. ![
  39. '/edu-oauth/userlogin',
  40. '/edu-oauth/smsLogin',
  41. '/edu-oauth/open/sendSms',
  42. '/edu-app/open/userOrder/registerGoods'
  43. ].includes(url)
  44. ) {
  45. authHeaders.Authorization = Authorization;
  46. }
  47. return {
  48. url,
  49. options: {
  50. ...options,
  51. params: cleanDeep(options.params),
  52. data: cleanDeep(options.data),
  53. headers: {
  54. ...options.headers,
  55. ...authHeaders
  56. }
  57. }
  58. };
  59. },
  60. { global: false }
  61. );
  62. request.interceptors.response.use(
  63. async res => {
  64. toast = setTimeout(() => {
  65. closeToast();
  66. }, 100);
  67. if (res.status > 299 || res.status < 200) {
  68. clearTimeout(toast);
  69. const msg = '服务器错误,状态码' + res.status;
  70. showToast(msg);
  71. throw new Error(msg);
  72. }
  73. const data = await res.clone().json();
  74. // 999 为特殊code码
  75. if (data.code !== 200 && data.errCode !== 0 && data.code !== 999) {
  76. let msg = data.msg || data.message || '处理失败,请重试';
  77. if (initRequest) {
  78. if (data.code === 403 || data.code === 5000) {
  79. setLogout();
  80. } else {
  81. setLoginError();
  82. }
  83. }
  84. if (!(data.code === 403 || data.code === 5000)) {
  85. clearTimeout(toast);
  86. showToast(msg);
  87. }
  88. const browserInfo = browser();
  89. if (data.code === 5000 || data.code === 403) {
  90. msg += ' authentication ' + data.code;
  91. if (browserInfo.isApp) {
  92. postMessage({
  93. api: 'login'
  94. });
  95. } else {
  96. setLogout();
  97. }
  98. }
  99. throw new Error(msg);
  100. }
  101. return res;
  102. },
  103. { global: false }
  104. );
  105. export default request;