当前位置: 首页 > news >正文

vue项目封装axios请求,支持判断当前环境及判断token是否过期等等(详细教程,可复制粘贴代码)

目录

1.准备工作,创建js/ts文件,用于写封装axios的代码

2.准备工作,创建常见网络请求状态码信息文件

1.在项目根目录的utils文件夹中创建status.ts文件

2.复制粘贴以下代码,有需要可以自行删改,以下是本人常用的

3.准备工作,创建不同环境所使用的访问地址存放的文件

1.在项目根目录创建.env文件

2.配置对应环境的访问地址

4.封装axios请求

1.在第1步中创建的request.ts文件中粘贴以下代码

2.使用token配置请求头解释

3.token(登录)过期解释

4.自动判断运行环境,并采用不同的访问接口解释

5.在其他文件引入和使用封装好的axios请求

1.文件夹结构例子,在login.ts中引入和使用

2.引入和使用

3.在.vue文件中引入登录请求方法和使用


一个应用中,网络请求是必不可少的,vue项目中,常常使用Axios 请求。Axios 是一个基于 Promise 的 HTTP 客户端,用于在浏览器和 node.js 中发送 HTTP 请求。下面给大家介绍一下如何封装Axios ,以及封装时常常会增加的一些功能。

1.准备工作,创建js/ts文件,用于写封装axios的代码

注意:根据项目的实际情况使用js/ts文件,以下.ts文件亦可为.js文件,不再重复讲述了

vue项目中,通常在项目根目录的utils文件夹中创建封装axios的文件(如果没有就新建一个),以此为例子,创建request.ts文件

2.准备工作,创建常见网络请求状态码信息文件

用于发起网络请求遇到常见问题时的提示

1.在项目根目录的utils文件夹中创建status.ts文件

2.复制粘贴以下代码,有需要可以自行删改,以下是本人常用的
export const showMessage = (status: number | string): string => {let message: string = "";switch (status) {case 400:message = "请求错误(400)";break;case 401:message = "未授权,请重新登录(401)";break;case 403:message = "拒绝访问(403)";break;case 404:message = "请求出错(404)";break;case 408:message = "请求超时(408)";break;case 500:message = "服务器错误(500)";break;case 501:message = "服务未实现(501)";break;case 502:message = "网络错误(502)";break;case 503:message = "服务不可用(503)";break;case 504:message = "网络超时(504)";break;case 505:message = "HTTP版本不受支持(505)";break;default:message = `连接出错(${status})!`;}return `${message},请检查网络或联系管理员!`;
};

3.准备工作,创建不同环境所使用的访问地址存放的文件

通常不同的环境使用不同的访问地址,以生产环境和开发环境为例

1.在项目根目录创建.env文件

第一个文件是开发环境,第二个文件是生产环境

2.配置对应环境的访问地址
# .env.development
# 开发环境
VITE_APP_ENV = 'development'
VUE_APP_API_URL = '/api' // 接口地址的前缀,例如有接口:/api/login/numLogin,就可以把/api写在这里,根据后端实际地址VITE_APP_BASE_URL = '' // 单引号内写你的开发环境地址
# .env.production
# 生产环境
VITE_APP_ENV = 'production'
VUE_APP_API_URL = ''# 服务器地址
# VITE_APP_BASE_URL = '' // 单引号内写你的生产环境地址

4.封装axios请求

1.在第1步中创建的request.ts文件中粘贴以下代码

注意:接口超时时间、token过期判断、token过期处理等都更具你的实际情况删改,以下为本人常用的代码

import axios from "axios";
import { showMessage } from "./status"; // 引入状态码(第2步创建的文件)
import { ElMessage } from "element-plus"; // 引入提示框(以使用elementPlus这个UI库为例)
import { useRouter } from 'vue-router';
const router = useRouter(); // 获取路由实例
// 设置接口超时时间
axios.defaults.timeout = 60000;
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded';// console.log('当前环境', import.meta.env.VITE_APP_ENV);
// console.log('地址', import.meta.env.VITE_APP_BASE_URL);// 判断当前的运行环境,可作出对应处理
if (import.meta.env.VITE_APP_ENV === "production") {// 生产环境axios.defaults.baseURL = import.meta.env.VITE_APP_BASE_URL;// 可根据需要写接口,也可以用第3步.env文件配置的接口
} else if (import.meta.env.VITE_APP_ENV === "development") {// 开发环境axios.defaults.baseURL = '/api' // 可根据需要写接口,也可以用第3步.env文件配置的接口
}
// axios.defaults.baseURL = import.meta.env.VITE_APP_ENV === "development" ? import.meta.env.VITE_APP_BASE_URL : config.baseUrl;  // 服务器接口地址前缀const token = () => {// 判断token是否存在函数const storedToken = localStorage.getItem("token");// console.log("token:", localStorage.getItem("token"));if (storedToken) {return storedToken;} else {// console.warn("Token 不存在!");return ""; // 或者返回 null,具体视后端需求而定}
};const getCookie = (name: string) => {const value = `; ${document.cookie}`;const parts = value.split(`; ${name}=`);if (parts.length === 2) return parts.pop().split(';').shift();
};//请求拦截
axios.interceptors.request.use((config) => {// 配置请求头config.headers["Content-Type"] = "application/json;charset=UTF-8";const authToken = token();if (authToken) {config.headers["Authorization"] = authToken;} else {// console.warn("请求头中未包含 Token");}//配置令牌等return config;},(error) => {return Promise.reject(error);}
);// 响应拦截
axios.interceptors.response.use((response: any) => {// console.log('响应成功:', response.request.responseURL);// console.log('响应成功:', response.data.code);// 判断token是否过期if (response) {// 假设当token过期时,后端返回内容中的code为997(根据后端实际情况而定)if (response.data.code === 997 && response.request.responseURL.slice(-5) !== 'login') {// 未授权,通常是 Token 过期或无效ElMessage.error("登录状态已过期,请重新登录!");localStorage.removeItem("token");// 写登录过期的处理代码,例如返回登陆页面router.push('/login');}}return response; // 确保返回整个响应对象,或根据需求返回 response.data},(error: any) => {if (error.response) {// 状态码不是 2xx// console.error('响应错误:', error.response);showMessage(error.response.status);return Promise.reject(error.response.data || error.response);} else if (error.request) {// 请求已发送,但没有收到响应// console.error('请求未收到响应:', error.request);ElMessage.warning("网络连接异常,请检查您的网络设置或稍后再试!");return Promise.reject(error.request);} else {// 其他错误// console.error('未知错误:', error.message);ElMessage.error("请求过程中发生未知错误,请稍后再试!");return Promise.reject(error.message || 'Unknown Error');}}
);export function request(config: { method: string, url: string, data?: any, params?: any }) {// console.log('发送请求:', config);return axios(config).then((response: any) => {// console.log('收到响应:', response);return response.data; // 或根据需求返回整个响应对象}).catch((err: any) => {console.error('请求失败:', err);return Promise.reject(err);});
}
2.使用token配置请求头解释

当请求数据时,后端需要判断用户的登录是否过期,通常除了登录接口外,在请求其他接口时都用token作为请求头发送给后端

3.token(登录)过期解释

本人这边,后端如果返回内容中的code为997,那就代表token过期,在这里可以做清除token及其他用户信息处理,并前往登录页面/login

4.自动判断运行环境,并采用不同的访问接口解释

可通过打印以下内容,查看当前项目的运行环境及在使用的访问地址情况

 console.log('当前环境', import.meta.env.VITE_APP_ENV);console.log('地址', import.meta.env.VITE_APP_BASE_URL);

在第3步中,我们创建了2个代表不同环境的文件,分别配置了不同环境下使用的访问地址,可根据需要写接口,也可以用第3步.env文件配置的接口

5.在其他文件引入和使用封装好的axios请求

1.文件夹结构例子,在login.ts中引入和使用

创建login.ts 文件

2.引入和使用
import { request } from "@/utils/request"; // 引入axios请求方法// 登录
export function login(data: any) { // 使用方法return request({method: "post",// 请求方式url: `/vue/login`,// 接口,根据实际情况写data,// 请求参数});
}
3.在.vue文件中引入登录请求方法和使用

引入登录请求方法代码

import { login } from '@/api/login.ts'

发起请求代码

let para = {}// 请求参数
login(para).then((res: any) => {// res为返回内容
}).finally(() => {// 请求完成处理
})

欢迎学习和交流!

http://www.dtcms.com/a/327386.html

相关文章:

  • cuda排序算法--双调排序(Bitonic_Sort)
  • 【数据库】 MySQL 表的操作详解
  • 蓝桥杯手算题和杂题简易做法
  • 《Auracast广播音频技术解析及未来路线图》 —蓝牙技术联盟 市场拓展经理 吴志豪 技术与市场经理 鲁公羽
  • 基于 DiT 大模型与字体级分割的视频字幕无痕擦除方案,助力短剧出海
  • 深度学习与遥感入门(六)|轻量化 MobileNetV2 高光谱分类
  • 4.7 GB 视频导致浏览器内存溢出(OOM)的解决方案
  • 从零部署Nacos:替代Eureka的服务注册与服务发现基础教程
  • 视频输入输出模块介绍和示例
  • Dubbo 3.x源码(33)—Dubbo Consumer接收服务调用响应
  • Python day42
  • tensorrt-llm0.20.0离线部署DeepSeek-R1-Distill-Qwen-32B
  • 第六十三章:AI模型的“跨界之旅”:不同硬件架构下的兼容性方案
  • Linux NAPI 实现机制深度解析
  • 【CDA 新一级】学习笔记第1篇:数据分析的时代背景
  • 【前端八股文面试题】【JavaScript篇7】什么是JavaScript的原型、原型链? 有什么特点
  • 【设计模式精解】Java实现责任链模式(职责链模式)优雅处理多级请求(概述,使用场景,优缺点,代码示例)
  • Rust:构造函数 new() 如何进行错误处理?
  • 信号(Signal)** 是一种进程间异步通信机制,用于通知进程发生发生了某种事件(如错误、用户中断等)
  • 疯狂星期四文案网第37天运营日记
  • Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
  • 通过限制对象的内存分配位置来实现特定的设计目标
  • 【数据结构入门】堆
  • powerbi本地报表发布到web,以得到分享链接
  • C99中的变长数组(VLA)
  • 什么是 Spring MVC?
  • 中扬立库与西门子深化技术协同 共绘智能仓储创新蓝图
  • clean install 和 clean package 的区别
  • JVM学习笔记-----图解方法执行流程
  • 百胜软件×华为云联合赋能,“超级国民品牌”海澜之家新零售加速前行