request.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { extend } from 'umi-request'
  2. import { Toast } from 'vant'
  3. import cleanDeep from 'clean-deep'
  4. import { getRequestHostname, browser } from '/src/helpers/utils'
  5. import ApiRouter from '/src/api-router'
  6. import { postMessage } from './native-message'
  7. export interface SearchInitParams {
  8. rows?: string | number;
  9. page?: string | number;
  10. }
  11. export interface InitSearchRespones {
  12. data: {
  13. rows: any[],
  14. [key: string]: any
  15. },
  16. [key: string]: any
  17. }
  18. let isOpenLogin = false
  19. const request = extend({
  20. requestType: 'json',
  21. timeout: 10000,
  22. prefix: getRequestHostname(),
  23. })
  24. request.use(async (ctx, next) => {
  25. const { url, options } = ctx.req
  26. const prefix = (options.prefix || '')
  27. const baseUrl: string = url.replace(prefix, '') || ''
  28. const linkUrl: string = (ApiRouter as any)[baseUrl]
  29. if (linkUrl) {
  30. ctx.req.url = prefix + linkUrl
  31. }
  32. await next()
  33. })
  34. request.interceptors.request.use(
  35. (url, options: any) => {
  36. const Authorization = (sessionStorage.getItem('Authorization') || '')
  37. const authHeaders: any = {}
  38. if (Authorization && !['/api-auth/usernameLogin', '/api-auth/smsLogin', '/api-auth/code/sendSms'].includes(url)) {
  39. authHeaders.Authorization = Authorization
  40. }
  41. return {
  42. url,
  43. options: {
  44. ...options,
  45. params: cleanDeep(options.params),
  46. headers: {
  47. ...options.headers,
  48. ...authHeaders
  49. }
  50. }
  51. }
  52. },
  53. { global: false }
  54. )
  55. request.interceptors.response.use(
  56. async (res, options) => {
  57. const url = new URL(res.url)
  58. if (res.status > 299 || res.status < 200) {
  59. const msg = '服务器错误,状态码' + res.status
  60. Toast(msg)
  61. throw new Error(msg)
  62. }
  63. const data = await res.clone().json()
  64. if (data.code !== 200 && data.errCode !== 0) {
  65. const msg = data.msg || '处理失败,请重试'
  66. if (!(data.code === 403 || data.code === 401)) {
  67. Toast(msg)
  68. }
  69. const browserInfo = browser()
  70. if (data.code === 403 && browserInfo.isApp && !isOpenLogin) {
  71. if(browserInfo.android) {
  72. postMessage({
  73. api: 'login'
  74. });
  75. (window as any).DAYA.postMessage(JSON.stringify({api: 'login'}))
  76. } else if(browserInfo.iPhone) {
  77. (window as any).webkit.messageHandlers.DAYA.postMessage(JSON.stringify({api: 'login'}))
  78. }
  79. }
  80. throw new Error(msg)
  81. }
  82. return res
  83. },
  84. { global: false }
  85. )
  86. export default request