axios封装,使用拦截器统一处理接口,超详细的教程(推荐)


Posted in Javascript onMay 02, 2019

最近从0开始搭了一个vue-cli的项目, 虽然axios也可以直接拿来用,但是对接口比较零散,不太好进行维护,也会产生大量的重复代码,所以笔者对axios进行了统一接口处理,废话不多说,直接上代码。   

首先,在vue-cli项目的src路径下新建一个axios文件夹,在axios文件夹里新建aps.js和request.js,api.js用于写接口,对axios的封装写在request.js里,项目机构如图:

axios封装,使用拦截器统一处理接口,超详细的教程(推荐)

1. axios统一封装

然后开始统一封装axios, 首先引入axios、qs依赖,引入main.js主要是用于后面对接口进行统一处理,比如调接口的时候,显示loading等。这个main.js根据你个人情况,可加可不加。

//request.js
import axios from "axios";
import qs from "qs";
import app from "../main.js";

然后创建一个axios实例,这个process.env.BASE_URL在config/dev.evn.js、prod.evn.js里面进行配置:

/****** 创建axios实例 ******/
const service = axios.create({
  baseURL: process.env.BASE_URL, // api的base_url
  timeout: 5000 // 请求超时时间
});

axios实例创建好之后,开始使用request拦截器对axios请求配置做统一处理,具体如下:

/****** request拦截器==>对请求参数做处理 ******/
service.interceptors.request.use(config => {
  app.$vux.loading.show({
    text: '数据加载中……'
  });
 
  config.method === 'post'
    ? config.data = qs.stringify({...config.data})
    : config.params = {...config.params};
  config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
 
  return config;
}, error => { //请求错误处理
  app.$vux.toast.show({
    type: 'warn',
    text: error
  });
  Promise.reject(error)
});

然后是对response做统一处理,代码如下:

/****** respone拦截器==>对响应做处理 ******/
service.interceptors.response.use(
  response => { //成功请求到数据
    app.$vux.loading.hide();
    //这里根据后端提供的数据进行对应的处理
    if (response.data.result === 'TRUE') {
      return response.data;
    } else {
      app.$vux.toast.show({ //常规错误处理
        type: 'warn',
        text: response.data.data.msg
      });
    }
  },
  error => { //响应错误处理
    console.log('error');
    console.log(error);
    console.log(JSON.stringify(error));
 
    let text = JSON.parse(JSON.stringify(error)).response.status === 404
      ? '404'
      : '网络异常,请重试';
    app.$vux.toast.show({
      type: 'warn',
      text: text
    });
 
    return Promise.reject(error)
  }
);

最后,将我们的axios实例暴露出去,整个axios的封装就写完了。

export default service;

2. axios接口的调用方式

axios封装好之后,调用就很简单了。我们把接口统一写在api.js文件里。(当然,如果你的业务非常复杂的话,建议把不同业务的api分开放到不同的文件里,这样方便以后维护)。

注意:post请求参数放在data里面,get请求参数放在params里。

//api.js
import service from './request'
 
export const getPersonInfo = data => {
  return service({
    url: '/person_pay/getpersoninfo',
    method: 'post',
    data
  })
};

然后在具体的组件中进行调用。

//index.vue
import {getPersonInfo} from '../axios/api.js'
export default {
  created: async function () {
    const params = {
      card_no: '111'
    };
    let res = await getPersonInfo(params);
    console.log(res);
  }
}

附上项目代码地址:  https://github.com/xie991283109/vueCli-test

以上所述是小编给大家介绍的axios封装使用拦截器处理接口详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

 

Javascript 相关文章推荐
jquery CSS选择器笔记
Mar 29 Javascript
javascript hashtable 修正版 下载
Dec 30 Javascript
html的DOM中Event对象onabort事件用法实例
Jan 21 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
浅谈Javascript数组(推荐)
May 17 Javascript
利用Angularjs中模块ui-route管理状态的方法
Dec 27 Javascript
Node.js常用工具之util模块
Mar 09 Javascript
在Swiper内如何制作CSS3动画效果示例代码
Dec 07 Javascript
vue组件jsx语法的具体使用
May 21 Javascript
浅析前端路由简介以及vue-router实现原理
Jun 01 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
Layui 导航默认展开和菜单栏选中高亮设置的方法
Sep 04 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
May 02 #Javascript
详解微信小程序缓存--缓存时效性
May 02 #Javascript
详解如何使用router-link对象方式传递参数?
May 02 #Javascript
详解Vue底部导航栏组件
May 02 #Javascript
微信小程序搭建自己的Https服务器
May 02 #Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 #Javascript
详解微信小程序网络请求接口封装实例
May 02 #Javascript
You might like
PHP实现异步调用方法研究与分享
2011/10/27 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
PHP并发查询MySQL的实例代码
2017/08/09 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jQuery+css实现的时钟效果(兼容各浏览器)
2016/01/27 Javascript
AngularJs bootstrap详解及示例代码
2016/09/01 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
angularJS开发注意事项
2018/05/26 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python检测远程udp端口是否打开的方法
2015/03/14 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
详解python中的json和字典dict
2018/06/22 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
Linux上比较文件的命令都有哪些
2013/09/28 面试题
幼儿园园务工作总结2015
2015/05/18 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
公司年会晚会开幕词
2019/04/02 职场文书
餐厅营销的秘密:为什么老顾客会流水?
2019/08/08 职场文书
Redis IP地址的绑定的实现
2021/05/08 Redis
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫