chenyc
2022-09-08 f611789518e4977c211fe8b1e03cb2f8e627445a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import Axios, {
    AxiosError,
    AxiosResponse,
    AxiosRequestConfig,
    AxiosInstance
} from 'axios'
import { Session } from '@/utils/storage'
 
let controllers: AbortController[] = []
 
const BASE_URL = 'https://hemobs.icoldchain.cn'
const TIME_OUT = 10 * 1000
 
interface IResponseError {
    code: number,
    result: boolean,
    message: string
}
 
/**
 * 创建axios实例
 */
const instance: AxiosInstance = Axios.create({
    baseURL: BASE_URL,
    timeout: TIME_OUT
    // withCredentials: true
})
 
/**
 * 错误处理函数
 */
const errorMsgHandler = (code, data): string | undefined => {
    const { message } = data
    const msgMap = {
        400: message || '400 error 请求无效',
        401: '401 error 登录失效,请重新登录!',
        403: '403 error 对不起,你没有访问权限!',
        404: '404 Not Found',
        500: message || '500 error 后台错误,请联系管理员',
        502: '502 error 平台环境异常'
    }
    return msgMap[code]
}
 
const errorHandle = (error): IResponseError => {
    const { data, status, statusText } = error.response
    const msg = errorMsgHandler(status, data) || `${status} error ${data ? data.message : statusText}`
    alert(msg)
    return {
        code: status,
        result: false,
        message: msg
    }
}
 
/**
 * 获取token,根据项目中后台的传递方式调整。这里使用的是cookie传递
 * **/
const getToken = (): string => {
    if (Session.get('token')) {
        return 'Bearer '+ `${Session.get('token')}`
    }
    return ''
}
 
// 前置拦截器(发起请求之前的拦截)
instance.interceptors.request.use((config: AxiosRequestConfig) => {
    console.log('sss',config)
    config.headers && (config.headers['Authorization'] = getToken())
    const controller = new AbortController()
    config.signal = controller.signal
    controllers.push(controller)
    return config
})
 
// 后置拦截器(获取到响应时的拦截)
instance.interceptors.response.use(
    (response: AxiosResponse) => {
        const { data, status } = response
        console.log('返回结果',data)
        const { message } = data
        // 请求正常时,仅返回需要用到的 data 信息即可
        if (message==='SUCCESS') return data.data
        // 1、对于一些请求正常,但后台处理失败的内容进行拦截,返回对应错误信息
        alert(message || '请求异常,请刷新重试')
        return {
            code: status,
            message: message || '请求异常,请刷新重试',
            result: data
        }
    },
    (error: AxiosError) => {
        return error.response ? errorHandle(error) : Promise.reject(error)
    }
)
 
export const cancelRequest = () => {
    controllers.forEach(controller => {
        controller.abort()
    })
    controllers = []
}
 
const ajaxGet = (url: string, params?: any): Promise<AxiosResponse> => instance.get(url, { params })
const ajaxDelete = (url: string, params?: any): Promise<AxiosResponse> => instance.delete(url, { params })
const ajaxPost = (url: string, params: any, config?: AxiosRequestConfig): Promise<AxiosResponse> => instance.post(url, params, config)
const ajaxPut = (url: string, params: any, config?: AxiosRequestConfig): Promise<AxiosResponse> => instance.put(url, params, config)
const ajaxPatch = (url: string, params: any, config?: AxiosRequestConfig): Promise<AxiosResponse> => instance.patch(url, params, config)
 
 
export {
    ajaxGet,
    ajaxDelete,
    ajaxPost,
    ajaxPut,
    ajaxPatch
}
 
// export default instance