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 AnythingSlider滑动效果插件
Feb 07 Javascript
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
javascript语言结构小记(一)
Sep 10 Javascript
终于解决了IE8不支持数组的indexOf方法
Apr 03 Javascript
JS获取单击按钮单元格所在行的信息
Jun 17 Javascript
JavaScript动态提示输入框输入字数的方法
Jul 27 Javascript
基于原生js淡入淡出函数封装(兼容IE)
Oct 20 Javascript
微信小程序promsie.all和promise顺序执行
Oct 27 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
May 13 Javascript
Vue组件间的通信pubsub-js实现步骤解析
Mar 11 Javascript
JS代码简洁方式之函数方法详解
Jul 28 Javascript
Openlayers绘制地图标注
Sep 28 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 生成WML页面方法详解
2009/08/09 PHP
利用Memcached在php下实现session机制 替换PHP的原生session支持
2010/08/21 PHP
PHP设计模式之委托模式定义与用法简单示例
2018/08/13 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
Vue实现todolist删除功能
2018/06/26 Javascript
详谈js的变量提升以及使用方法
2018/10/06 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
详解关闭令人抓狂的ESlint 语法检测配置方法
2019/10/28 Javascript
jquery实现直播弹幕效果
2019/11/28 jQuery
ES6学习笔记之let与const用法实例分析
2020/01/22 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
Python入门篇之字典
2014/10/17 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
聚美优品广告词改编
2014/03/14 职场文书
计划生育宣传标语
2014/06/21 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
预备党员半年考察意见
2015/06/01 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers