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
前端菜鸟一枚,如有错误之处,烦请指出,与大家共同进步!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理