封装axios要处理的核心点:
- Loading处理
- 请求前的 Loading
- 请求后的 Loading
- 错误拦截
- 请求拦截
- AuthorizationToken
- 响应拦截
- 请求出错的处理
- 响应出错的处理,重点
- 响应状态处理
- 异常信息提示
- 请求拦截
- 取消请求
- 请求前,先取消上一个请求,例如:用户狂点请求,取消重复的请求
- 请求缓存 requestCache
https://juejin.cn/post/7003585746065948703
https://juejin.cn/post/6847009771606769677
https://juejin.cn/post/6968630178163458084
https://juejin.cn/post/6844903969152565261
https://juejin.cn/post/6968487137670856711
request
数据清洗
请求前的数据清洗,删除掉 undefined, ‘’, null等 falsy值
jwt设置请求头
get请求 Content-Type
get请求参数的序列化
Content-Type: application/jsonContent-Type: application/x-www-form-urlencodedContent-Type: multipart/form-data
post请求
响应拦截
错误处理
后端响应错误处理
客户端断网处理
3xx重定向
4xx权限处理
5xx错误
根据不同的状态码,生成不同的提示信息
const showStatus = (status) => {let message = ''// 这一坨代码可以使用策略模式进行优化switch (status) {case 400:message = '请求错误(400)'breakcase 401:message = '未授权,请重新登录(401)'breakcase 403:message = '拒绝访问(403)'breakcase 404:message = '请求出错(404)'breakcase 408:message = '请求超时(408)'breakcase 500:message = '服务器错误(500)'breakcase 501:message = '服务未实现(501)'breakcase 502:message = '网络错误(502)'breakcase 503:message = '服务不可用(503)'breakcase 504:message = '网络超时(504)'breakcase 505:message = 'HTTP版本不受支持(505)'breakdefault:message = `连接出错(${status})!`}return `${message},请检查网络或联系管理员!`}// 响应拦截器service.interceptors.response.use((response) => {const status = response.statuslet msg = ''if (status < 200 || status >= 300) {// 处理http错误,抛到业务代码msg = showStatus(status)if (typeof response.data === 'string') {response.data = { msg }} else {response.data.msg = msg}}return response}, (error) => {// 错误抛到业务代码error.data = {}error.data.msg = '请求超时或服务器异常,请检查网络或联系管理员!'return Promise.resolve(error)})
跨域处理
轻松处理跨域和超时的问题
- 否允许跨域的属性 withCredentials
- 超时时间的属性——timeout
