request.ts 2.9 KB

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