Vue封装Axios请求和拦截器的步骤


Posted in Javascript onSeptember 16, 2020

PS:本文代码在vue-cli3构建的基础vue项目之上进行编写:vue create my-project

axios 是一个基于 promise 的 http 库,可以用在浏览器和 node.js 中, 也是vue官方推荐使用的http库。

axios很好用,其中之一就是它的拦截器十分强大,我们可以为请求和响应设置拦截器,比如请求拦截器可以在每个请求里加上token,做了统一处理后维护起来也方便,响应拦截器可以在接收到响应后先做一层操作,如根据状态码判断登录状态、授权。

之前初学的时候,经常将axios数据请求写在各组件方法内,但实践证明,如果项目接口变动要修改url地址等参数会比较为麻烦,不易维护,于是需要对axios进行封装并将接口统一管理。

当然在最之前,我们需要安装axios,使用命令 npm install axios --save 即可。

一、新建函数文件

在 src目录 下新建一个 axios目录,然后在里面创建 axios-request.js 和 axios-api.js 两个文件,

其中 aixos-request.js 用于对axios进行封装,axios-api.js 用于接口的统一管理。

二、对axios进行封装

axios-request.js代码如下:

import axios from "axios";
import { Message } from "element-ui";

// 创建一个axios实例
const axiosService = axios.create({
 baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
 timeout: 5000 // 设置超时时间为5s
});

// request拦截器 ==> 对请求参数进行处理
axiosService.interceptors.request.use(
 config => {
 // 可以在发送请求之前做些事情
 // 比如请求参数的处理、在headers中携带token等等
 return config;
 }, error => {
 // 处理请求错误
 console.log(error); // for debug
 Promise.reject(error);
 }
);

// respone拦截器 ==> 对响应做处理
axiosService.interceptors.response.use(
 response => {
 const res = response.data;
 // 如果自定义的返回码不等于200, 就返回一个错误
 if (res.code !== 200) {
  return Promise.reject(new Error(res.message || "Error"))
 } else {
  return res;
 }
 }, error => {
 // 判断error的status代码,并将对应的信息告知用户
 let text = "";
 let err = JSON.parse(JSON.stringify(error));
 if (err.response.status) {
  switch (error.response.status) {
  case 400:
   text = "请求错误(400),请重新申请";
   break;
  case 401:
   text = "登录错误(401),请重新登录";
   return this.$router.replace("/login");
  case 403:
   text = "拒绝访问(403)";
   break;
  case 404:
   text = "请求出错(404)";
   break;
  case 408:
   text = "请求超时(408)";
   break;
  case 500:
   text = "服务器错误(500),请重启软件或切换功能页!";
   break;
  case 501:
   text = "服务未实现(501)";
   break;
  case 502:
   text = "网络错误(502)";
   break;
  case 503:
   text = "服务不可用(503)";
   break;
  case 504:
   text = "网络超时(504)";
   break;
  case 505:
   text = "HTTP版本不受支持(505)";
   break;
  default:
   text = "网络连接出错";
  }
 } else {
  text = "连接服务器失败,请退出重试!";
 }
 Message({
  showClose: true,
  message: text,
  type: "error"
 });
 return Promise.reject(error);
 }
);

// 将写好的axios实例暴露出去
export default axiosService;

三、对接口进行统一管理

axios-api.js代码如下:

import axiosService from "./axios-request"; // 从axios-request.js内引入axiosService

// 下面是POST形式
export const userLogin = data => {
 return axiosService({
 url: "/xxxx/user/xxxx", // 根据实际接口地址来写
 method: "post",
 data
 });
};

// 下面是GET形式
export const userInfo = params => {
 return axiosService({
 url: "/xxxx/user/xxxx", // 根据实际接口地址来写
 method: "get",
 params
 });
};

这里要注意下,post参数放在data内,get参数放在params内!

四、在组件内使用写好的接口

在组件中使用:

下面是模拟的一个登录接口,代码不太严谨,仅演示大致用法:

<script>
import {userLogin} from "@/axios/axios-api"; // 引入登录接口函数

export default {
 name: "login",
 components: {},
 methods: {
 async login() {
  let username = this.username;
  let password = this.password;
  let params = {
  username: username,
  password: password
  };
  if (!username || !password) {
  alert("账号或密码不能为空");
  } else {
  if (username.length < 51 && password.length < 51) {
   let res = await userLogin(params);
   console.log(res);
  } else {
   alert("账号或密码输入字符不能超过50位");
  }
  }
 }
 }
};
</script>

上面的代码中我们用了 async await,是ES7新出的特性,具体用法可以Google或者到MDN上查看。

五、总结

当然也可以不将接口统一管理,而只用axios封装,然后在组件内写异步请求函数。

以上是个人在之前学习的时候,所用的封装方式,如有错误之处欢迎留言指正。

以上就是Vue封装Axios请求和拦截器的步骤的详细内容,更多关于Vue封装的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
JSON 客户端和服务器端的格式转换
Aug 27 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
Nov 27 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
Oct 29 Javascript
用js将内容复制到剪贴板兼容浏览器
Mar 18 Javascript
jQuery使用addClass()方法给元素添加多个class样式
Mar 26 Javascript
关于JavaScript的单双引号嵌套问题
Aug 20 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
Vue不能观察到数组length的变化
Jun 08 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
Sep 02 Javascript
React实现评论的添加和删除
Oct 20 Javascript
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
如何在JS文件中获取Vue组件
Sep 16 #Javascript
javascript自定义加载loading效果
Sep 15 #Javascript
图解JS原型和原型链实现原理
Sep 15 #Javascript
vue实现简单全选和反选功能
Sep 15 #Javascript
vscode 调试 node.js的方法步骤
Sep 15 #Javascript
js实现特别简单的钟表效果
Sep 14 #Javascript
仿照Element-ui实现一个简易的$message方法
Sep 14 #Javascript
You might like
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
JavaScript基础——使用Canvas绘图
2016/11/02 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
微信小程序实现多选框全选与反全选及购物车中删除选中的商品功能
2019/12/17 Javascript
python的几种开发工具介绍
2007/03/07 Python
Python 异常处理实例详解
2014/03/12 Python
python局域网ip扫描示例分享
2014/04/03 Python
实例解析Python设计模式编程之桥接模式的运用
2016/03/02 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Php多进程实现代码
2018/05/07 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
EJB3推出JPA的原因
2013/10/16 面试题
自考毕业自我鉴定范文
2013/10/27 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
单位工作证明
2014/10/07 职场文书
裁员通知
2015/04/25 职场文书
行政处罚决定书
2015/06/24 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书