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 相关文章推荐
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
js/jquery去掉空格,回车,换行示例代码
Nov 05 Javascript
JS判断对象是否存在的10种方法总结
Dec 23 Javascript
对Js OOP编程 创建对象的一些全面理解
Jul 26 Javascript
javascript跨域请求包装函数与用法示例
Nov 03 Javascript
js闭包用法实例详解
Dec 13 Javascript
JS动画定时器知识总结
Mar 23 Javascript
浅谈AngularJS中$http服务的简单用法
May 15 Javascript
vue form 表单提交后刷新页面的方法
Sep 04 Javascript
vue集成百度UEditor富文本编辑器使用教程
Sep 21 Javascript
JS获取月的第几周和年的第几周实例代码
Dec 05 Javascript
js页面加载后执行的几种方式小结
Jan 30 Javascript
如何在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动态变静态原理
2006/11/25 PHP
windows xp下安装pear
2006/12/02 PHP
PHP生成随机数的方法实例分析
2015/01/22 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
js loading加载效果实现代码
2009/11/24 Javascript
JS二维数组的定义说明
2014/03/03 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
当jquery ajax遇上401请求的解决方法
2016/05/19 Javascript
JS新包管理工具yarn和npm的对比与使用入门
2016/12/09 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
python定时检查某个进程是否已经关闭的方法
2015/05/20 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
pandas之分组groupby()的使用整理与总结
2020/06/18 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
Gretna Green中文官网:苏格兰格林小镇
2019/10/16 全球购物
数字漫画:comiXology
2020/06/13 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
大学生英语演讲稿
2014/04/24 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
乡镇干部党的群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
2015年物业公司保洁工作总结
2015/10/22 职场文书
2016机关干部作风建设心得体会
2016/01/21 职场文书