vue项目常用之二:封装 axios 请求模块
Posted 浩荡九天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue项目常用之二:封装 axios 请求模块相关的知识,希望对你有一定的参考价值。
/** * 封装 axios 请求模块 */ import axios from ‘axios‘ import jsonBig from ‘json-bigint‘ import store from ‘@/store‘ import router from ‘@/router‘ import { Notify } from ‘vant‘ // axios.create 方法:复制一个 axios const request = axios.create({ baseURL: ‘http://ttapi.research.itcast.cn/‘ // 基础路径 }) /** * 配置处理后端返回数据中超出 js 安全整数范围问题 */ request.defaults.transformResponse = [function (data) { try { return jsonBig.parse(data) } catch (err) { return {} } }] // 请求拦截器 request.interceptors.request.use( function (config) { const user = store.state.user if (user) { config.headers.Authorization = `Bearer ${user.token}` } // Do something before request is sent return config }, function (error) { // Do something with request error return Promise.reject(error) } ) // 响应拦截器 request.interceptors.response.use( // 响应成功进入第1个函数 // 该函数的参数是响应对象 function (response) { // Any status code that lie within the range of 2xx cause this function to trigger // Do something with response data return response }, // 响应失败进入第2个函数,该函数的参数是错误对象 async function (error) { // Any status codes that falls outside the range of 2xx cause this function to trigger // Do something with response error // 如果响应码是 401 ,则请求获取新的 token // 响应拦截器中的 error 就是那个响应的错误对象 if (error.response && error.response.status === 401) { // 校验是否有 refresh_token const user = store.state.user if (!user || !user.refresh_token) { // router.push(‘/login‘) redirectLogin() // 代码不要往后执行了 return } // 如果有refresh_token,则请求获取新的 token try { const res = await axios({ method: ‘PUT‘, url: ‘http://ttapi.research.itcast.cn/app/v1_0/authorizations‘, headers: { Authorization: `Bearer ${user.refresh_token}` } }) // 如果获取成功,则把新的 token 更新到容器中 console.log(‘刷新 token 成功‘, res) store.commit(‘setUser‘, { token: res.data.data.token, // 最新获取的可用 token refresh_token: user.refresh_token // 还是原来的 refresh_token }) // 把之前失败的用户请求继续发出去 // config 是一个对象,其中包含本次失败请求相关的那些配置信息,例如 url、method 都有 // return 把 request 的请求结果继续返回给发请求的具体位置 return request(error.config) } catch (err) { // 如果获取失败,直接跳转 登录页 console.log(‘请求刷线 token 失败‘, err) // router.push(‘/login‘) redirectLogin() } } else if (error.response.status === 500) { Notify(‘服务端异常,请稍后重试‘) } return Promise.reject(error) } ) function redirectLogin () { // router.currentRoute 当前路由对象,和你在组件中访问的 this.$route 是同一个东西 router.push(‘/login?redirect=‘ + router.currentRoute.fullPath) } export default request
以上是关于vue项目常用之二:封装 axios 请求模块的主要内容,如果未能解决你的问题,请参考以下文章
axios网络请求基本使用配置使用(全局axios和局部axios实例)模块封装axios拦截器
SpringBoot + Spring Cloud +Vue 管理系统前端搭建(三工具模块封装)