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 技巧小结
Apr 02 Javascript
JavaScript判断是否为数组的3种方法及效率比较
Apr 01 Javascript
js事件驱动机制 浏览器兼容处理方法
Jul 23 Javascript
Javascript动画效果(2)
Oct 11 Javascript
JS实现身份证输入框的输入效果
Aug 21 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
实例解析Vue.js下载方式及基本概念
May 11 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
Aug 14 Javascript
JS猜数字游戏实例讲解
Jun 30 Javascript
解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题
Jul 27 Javascript
详解React中共享组件逻辑的三种方式
Feb 02 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中的cookie
2006/11/26 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
详解PHP执行定时任务的实现思路
2015/12/21 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
php源码的安装方法和实例
2019/09/26 PHP
线路分流自动跳转代码;希望对大家有用!
2006/12/02 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
javascript事件的传播基础实例讲解(35)
2017/02/14 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
JS实现的定时器展示简单秒表、页面弹框及跳转操作完整示例
2020/01/26 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
用webAPI实现图片放大镜效果
2020/11/23 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
python实现数独算法实例
2015/06/09 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
Python简单I/O操作示例
2019/03/18 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python sep参数使用方法详解
2020/02/12 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
苹果香港官方商城:Apple香港
2016/09/14 全球购物
Crocs波兰官方商店:女鞋、男鞋、童鞋、洞洞鞋
2019/10/08 全球购物
本科毕业生求职自荐信
2014/02/03 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android
详解MySQL的主键查询为什么这么快
2022/04/03 MySQL