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 相关文章推荐
JavaScript中Math对象使用说明
Jan 16 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
Apr 25 Javascript
js中parseInt函数浅谈
Jul 31 Javascript
jQuery父级以及同级元素查找介绍
Sep 04 Javascript
jquery将一个表单序列化为一个对象的方法
Dec 02 Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
Feb 22 Javascript
js闭包学习心得总结
Apr 17 Javascript
基于Vue自定义指令实现按钮级权限控制思路详解
May 23 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 Javascript
layui实现根据table数据判断按钮显示情况的方法
Sep 26 Javascript
vue项目配置sass及引入外部scss文件
Apr 14 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
php和javascript之间变量的传递实现代码
2012/12/19 PHP
php支付宝系列之电脑网站支付
2018/05/30 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
jQuery 图像裁剪插件Jcrop的简单使用
2009/05/22 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
一个css与js结合的下拉菜单支持主流浏览器
2014/10/08 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
jQuery元素选择器实例代码
2017/02/06 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
jQuery实现动态添加和删除input框实例代码
2019/03/26 jQuery
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
JS常见错误(Error)及处理方案详解
2020/07/02 Javascript
Python的函数的一些高阶特性
2015/04/27 Python
Python下线程之间的共享和释放示例
2015/05/04 Python
Python itertools模块详解
2015/05/09 Python
python实现多线程的两种方式
2016/05/22 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
python实现音乐下载的统计
2018/06/20 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
详解Python流程控制语句
2020/10/28 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
2014年设备管理工作总结
2014/11/26 职场文书
2014年小学教研工作总结
2014/12/06 职场文书
研究生导师评语
2014/12/31 职场文书
太行山上观后感
2015/06/05 职场文书
2017寒假社会实践心得体会范文
2016/01/14 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python