vue中对axios的封装

    xiaoxiao2022-07-05  160

    import axios from 'axios' // 引入axios // import store from '@/store/index' import router from '../router/index' import qs from 'qs' // 根据需求是否导入qs模块 import { Toast, Dialog } from 'vant' import common from '@/utils/common' let loading = {} const permitCodeList = [ 0 // 1, //删除默认场地时返回1 // 2, //添加设备时会返回2 设备已绑定 ] /** * 提示函数 * 禁止点击蒙层、显示一秒后关闭 */ const tip = msg => { Toast.fail({ message: msg, duration: 2000, forbidClick: true }) } /** * 跳转登录页 * 携带当前页面路由,以期在登录页面完成登录后返回当前页面 */ const toLogin = () => { router.replace({ path: '/login', query: { redirect: router.currentRoute.fullPath } }) } /** * 请求失败后的错误统一处理 * @param {Number} status 请求失败的状态码 */ const errorHandle = (status, other) => { // 状态码判断 switch (status) { // 401: 未登录状态,跳转登录页 case 400: tip('error: 400') break case 401: toLogin() break // 403 token过期 // 清除token并跳转登录页 case 403: tip('拒绝访问') // tip('登录过期,请重新登录') // localStorage.removeItem('token') // store.commit('loginSuccess', null) // setTimeout(() => { // toLogin() // }, 1000) break // 404请求不存在 case 404: tip('请求的资源不存在') break case 500: tip('服务器内部错误') break case 501: tip('服务未实现') break case 502: tip('网关错误') break case 503: tip('服务不可用') break case 504: tip('网关超时') break case 505: tip('HTTP版本不受支持') break default: break } } // 创建axios实例 var instance = axios.create({ timeout: 1000 * 12, baseURL: process.env.NODE_ENV === 'production' ? '/' : '/', withCredentials: !0 }) // 设置post请求头 instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' /** * 请求拦截器 * 每次请求前,如果存在token则在请求头中携带token */ instance.interceptors.request.use( config => { if (!Reflect.has(config.headers, 'hideLoading')) { loading = common.showLoading() } else { delete config.headers.hideLoading } // if (config.data === undefined ) { // loading = common.showLoading() // } else { // } // console.log('config', config) // 登录流程控制中,根据本地是否存在token判断用户的登录情况 // 但是即使token存在,也有可能token是过期的,所以在每次的请求头中携带token // 后台根据携带的token判断用户的登录情况,并返回给我们对应的状态码 // 而后我们可以在响应拦截器中,根据状态码进行一些统一的操作。 // const token = store.state.token // token && (config.headers.Authorization = token) if (Reflect.has(config.headers, 'formData')) { let data = qs.parse(config.data) config.data = qs.stringify({ ...data }) delete config.headers.formData } return config }, error => Promise.error(error) ) // 响应拦截器 instance.interceptors.response.use( // 请求成功 res => { if (Reflect.has(loading, 'clear')) { loading.clear() } if (res.data.code === -95) { Dialog.alert({ title: '提示', message: res.data.message }) router.replace({ path: '/blank' }) } else if (res.data.code === -99 || res.data.code === -96 || res.data.code === -100) { process.env.NODE_ENV === 'production' ? router.replace({ path: '/expired', query: { msg: res.data.message } }) : router.replace({ path: '/expired', query: { redirect: router.currentRoute.fullPath } }) } else if (permitCodeList.indexOf(res.data.code) === -1) { if (res.data.message.length > 5) { Dialog.alert({ title: '提示', message: res.data.message || '未知错误' }) } else { Toast.fail(res.data.message || '未知错误') } } return Promise.resolve(res.data) }, // res.status === 200 ? Promise.resolve(res.data) : Promise.reject(res), // 请求失败 error => { if (Reflect.has(loading, 'clear')) { loading.clear() } const { response } = error console.log('responseError', response) if (response) { // 请求已发出,但是不在2xx的范围 errorHandle(response.status, response.data.message) // return Promise.resolve(response.data) } else { tip('请求超时,请检查后重试') // 处理断网的情况 // eg:请求超时或断网时,更新state的network状态 // network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏 // 关于断网组件中的刷新重新获取数据,会在断网组件中说明 // store.commit('changeNetwork', false) } return { code: -1 } } ) export default instance

    使用:

    /** * test模块接口列表 */ import axios from '@/tools/http' // 导入http中创建的axios实例 const test = { jssdk () { return axios.get('/wx/bczc/get_token.php') } } export default test

    统一输出接口:

    /** * api接口的统一出口 */ // 文章模块接口 import article from '@/api/article' import test from '@/api/test' // 其他模块的接口…… // 导出接口 export default { article, test }

     

    最新回复(0)