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

vue对axios进行请求响应封装

一、原因

        像是在一些业务逻辑上,比如需要在请求之前展示loading效果,或者在登录的时候判断身份信息(token)等信息有没有过期,再者根据服务器响应回来的code码进行相应的提示信息。等等在请求之前,之后做的一些逻辑,都可以通过二次封装axios请求,进行实现。

二、具体的封装

        这里是对axios封装的一种形式,有多种形式,具体要根据具体业务需求去定。具体代码里面有具体注释。不再啰嗦,直接上具体代码吧,供参考!

// axios的封装
import axios, { HttpStatusCode } from "axios";
import { useRouter } from "vue-router";// 生产环境
const baseURLProd = "https://mall.quanrui.cc/api/v1/backend/";
// 测试环境
const baseURLDev = "http://139.9.197.13:8088/api/v1/backend/";
const baseURL = baseURLDev;   //更改baseurl// 使用路由
const router = useRouter();// 设置请求头
axios.defaults.headers.post["Content-Type"] =
"application/x-www-form-urlencoded;charset=UTF-8";// 创建axios示实例
let instance = axios.create({baseURL: baseURL,   //设置baseurltimeout: 5000, //超时时间
});// 跳转到登录页面,如果没有登录,或者登录信息过期的话
// 携带当前页面路由,以期在登录页面完成登录后返回当前页面
const toLogin = () => {router.replace({path: "/login",query: {redirect: router.currentRoute.fullPath,},});
};// 提示信息,Toast这个是第三方组件,根据使用的UI组件库不同进行更换
const tip = msg => {    Toast({        message: msg,        duration: 1000,        forbidClick: true    });
}// 请求拦截器
// (主要是在请求的时候携带请求token,以协助后端进行判断身份信息是否过期等),或者还可以在此增加业务操作,比如请求之前展示loading效果,具体可以拿个第三方UI库的一个效果过来使用
axios.interceptors.request.use(config => {// 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了// 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断const token = store.state.token;token && (config.headers.Authorization = token);return config;},error => {return Promise.error(error);}
);// 响应拦截器(主要对code进行判断,提示用户进行操作)
axios.interceptors.response.use(response => {if (response.status === 200) {return Promise.resolve(response);} else {return Promise.reject(response);}},// 服务器状态码不是200的情况error => {if (error.response.status) {switch (error.response.status) {// 401: 未登录// 未登录则跳转登录页面,并携带当前页面的路径// 在登录成功后返回当前页面,这一步需要在登录页操作。case 401:tip("未登录,请先登录");setTimeout(()=> {toLogin();},1000)break;// 403 token过期// 登录过期对用户进行提示// 清除本地token和清空vuex中token对象// 跳转登录页面case 403:tip("登录过期,请重新登录");// 清除tokenlocalStorage.removeItem("token"); //如果存在了浏览器的localStorage// store.commit("loginSuccess", null);    //如果存在store里的登录状态,获取其它相关信息// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面setTimeout(() => {toLogin();}, 1000);break;// 404请求不存在case 404:tip("网络请求不存在");break;// 其他错误,直接抛出错误提示default:tip(error.response.data.message);break;}return Promise.reject(error.response);}}
);//get方法
export function get(url, params){    return new Promise((resolve, reject) =>{        axios.get(url, {            params: params        })        .then(res => {            resolve(res.data);        })        .catch(err => {            reject(err.data)        })    });
}//post方法
export function post(url, params) {    return new Promise((resolve, reject) => {         axios.post(url, JSON.stringify(params))        .then(res => {            resolve(res.data);        })        .catch(err => {            reject(err.data)        })    });
}// put方法
export function put(url, params){    return new Promise((resolve, reject) =>{        axios.put(url, {            params: params        })        .then(res => {            resolve(res.data);        })        .catch(err => {            reject(err.data)        })    });
}// delete方法
export function del(url, params){    return new Promise((resolve, reject) =>{        axios.delete(url, {            params: params        })        .then(res => {            resolve(res.data);        })        .catch(err => {            reject(err.data)        })    });
}// 导出实例
export default instance;

三、对请求统一管理

        创建一个文件夹用于存放接口的请求,到时候用起来,只需要导出请求的方法就行,统一管理。不然全堆在页面上,一大串代码有点难看!

先从我们封装好的axios里面导出具体的请求方法

以下示例:

四、页面上使用

先导出请求接口的具体方法

import { pwlogin } from "../api/login";

 使用:

getloginres() {pwlogin(data).then((res) => {//数据处理}).catch((err) => console.log(err));}

以上就是全部,错误欢迎提出!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多输入多输出 | Matlab实现Transformer多输入多输出预测
  • 全网最适合入门的面向对象编程教程:14 类和对象的 Python 实现-类的静态方法和类方法,你分得清吗?
  • 视频调整帧率、分辨率+音画同步
  • 丑数问题,力扣264,坑点
  • markdown文件转pdf
  • 了解AsyncRotationController
  • 【C语言】C语言-身份证管理系统(源码+注释)【独一无二】
  • mybatis日志记录方案
  • 解决vue多层弹框时存在遮挡问题
  • 新质生产力赛道核心解读,机械制造何以“向智向新”
  • 深入理解Spring Cloud中的服务注册
  • Docker Desktop如何换镜像源?
  • jdevelope安装
  • MinIO:开源对象存储解决方案的领先者
  • FlyDeliver践行社会责任,推动绿色物流发展
  • [PHP内核探索]PHP中的哈希表
  • [译] React v16.8: 含有Hooks的版本
  • 77. Combinations
  • Bytom交易说明(账户管理模式)
  • Cookie 在前端中的实践
  • css选择器
  • exif信息对照
  • Go 语言编译器的 //go: 详解
  • GraphQL学习过程应该是这样的
  • HTML5新特性总结
  • iOS | NSProxy
  • KMP算法及优化
  • Making An Indicator With Pure CSS
  • mongo索引构建
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • SQLServer之创建数据库快照
  • windows-nginx-https-本地配置
  • 基于遗传算法的优化问题求解
  • 聊聊flink的BlobWriter
  • 前端性能优化——回流与重绘
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 双管齐下,VMware的容器新战略
  • 一个项目push到多个远程Git仓库
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • ​flutter 代码混淆
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #QT 笔记一
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (蓝桥杯每日一题)love
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (三)c52学习之旅-点亮LED灯
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (三)SvelteKit教程:layout 文件
  • (自用)仿写程序
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .Net 6.0 处理跨域的方式
  • .Net Core缓存组件(MemoryCache)源码解析