首页 > javascript相关 > vue教程 > 正文

vue axios基于常见业务场景的二次封装的实现_vue.js

2018-10-30 16:22:13

axios

axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

在前端框架中的应用也是特别广泛,不管是vue还是react,都有很多项目用axios作为网络请求库。

我在最近的几个项目中都有使用axios,并基于axios根据常见的业务场景封装了一个通用的request服务。

npm:

$ npm install axios

bower:

$ bower install axios

Using cdn:

<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

业务场景:

  1. 全局请求配置。
  2. get,post,put,delete等请求的promise封装。
  3. 全局请求状态管理,供加载动画等使用。
  4. 路由跳转取消当前页面请求。
  5. 请求携带token,权限错误统一管理。

默认配置

定义全局的默认配置

axios.defaults.timeout = 10000 //超时取消请求axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'axios.defaults.baseURL = process.env.BASE_URL 

自定义配置(非常见业务场景,仅作介绍)

// 创建实例时设置配置的默认值var instance = axios.create({ baseURL: 'https://api.another.com'});// 在实例已创建后修改默认值instance.defaults.headers.common['Authorization'] = AUTH_TOKEN;

优先级:自定义配置 > 默认配置

请求及响应拦截器

请求拦截器

// 请求列表const requestList = []axios.interceptors.request.use((config) => { //1.将当前请求的URL添加进请求列表数组 requestList.push(config.url) //2.请求开始,改变loading状态供加载动画使用 store.dispatch('changeGlobalState', {loading: true}) //3.从store中获取token并添加到请求头供后端作权限校验 const token = store.getters.userInfo.token if (token) {  config.headers.token = token } return config}, function (error) { return Promise.reject(error)})

1.请求拦截器中将所有请求的url添加进请求列表变量,为取消请求及loading状态管理做准备
2.请求一旦开始,就可以开启动画加载效果。
3.用户登录后可以在请求头中携带token做权限校验使用。

响应拦截器

axios.interceptors.response.use(function (response) { // 1.将当前请求中请求列表中删除 requestList.splice(requestList.findIndex(item => item === response.config.url), 1) // 2.当请求列表为空时,更改loading状态 if (requestList.length === 0) {  store.dispatch('changeGlobalState', {loading: false}) } // 3.统一处理权限认证错误管理 if (response.data.code === 900401) {  window.ELEMENT.Message.error('认证失效,请重新登录!', 1000)  router.push('/login') } return response}, function (error) { // 4.处理取消请求 if (axios.isCancel(error)) {  requestList.length = 0  store.dispatch('changeGlobalState', {loading: false})  throw new axios.Cancel('cancel request') } else {  // 5.处理网络请求失败  window.ELEMENT.Message.error('网络请求失败', 1000) } return Promise.reject(error)})

1.响应返回后将相应的请求从请求列表中删除
2.当请求列表为空时,即所有请求结束,加载动画结束
3.权限认证报错统一拦截处理
4.取消请求的处理需要结合其他代码说明
5.由于项目后端并没有采用RESTful风格的接口请求,200以外都归为网络请求失败

promise封装及取消请求

const CancelToken = axios.CancelToken//cancel token列表let sources = []const request = function (url, params, config, method) { return new Promise((resolve, reject) => {  axios[method](url, params, Object.assign({}, config, {  //1.通过将执行程序函数传递给CancelToken构造函数来创建cancel token   cancelToken: new CancelToken(function executor (c) {   //2.将cancel token存入列表    sources.push(c)   })  })).then(response => {   resolve(response.data)  }, err => {   if (err.Cancel) {    console.log(err)   } else {    reject(err)   }  }).catch(err => {   reject(err)  }) })}const post = (url, params, config = {}) => { return request(url, params, config, 'post')}const get = (url, params, config = {}) => { return request(url, params, config, 'get')}//3.导出cancel token列表供全局路由守卫使用export {sources, post, get}

1.axios cancel token API
2.存入需要取消的请求列表导出给导航守卫使用
3.router.js

...import { sources } from '../service/request'...router.beforeEach((to, from, next) => { document.title = to.meta.title || to.name  //路由发生变化时取消当前页面网络请求 sources.forEach(item => {  item() }) sources.length = 0 next()})

request.js完整代码:

// 引入网络请求库 https://github.com/axios/axiosimport axios from 'axios'import store from '../store'import router from '../router'// axios.defaults.timeout = 10000const requestList = []axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8'axios.defaults.baseURL = process.env.BASE_URL// 自定义拦截器axios.interceptors.request.use((config) => { requestList.push(config.url) store.dispatch('changeGlobalState', {loading: true}) const token = store.getters.userInfo.token if (token) {  config.headers.token = token } return config}, function (error) { return Promise.reject(error)})axios.interceptors.response.use(function (response) { requestList.splice(requestList.findIndex(item => item === response.config.url), 1) if (requestList.length === 0) {  store.dispatch('changeGlobalState', {loading: false}) } if (response.data.code === 900401) {  window.$toast.error('认证失效,请重新登录!', 1000)  router.push('/login') } return response}, function (error) { requestList.length = 0 store.dispatch('changeGlobalState', {loading: false}) if (axios.isCancel(error)) {  throw new axios.Cancel('cancel request') } else {  window.$toast.error('网络请求失败!', 1000) } return Promise.reject(error)})const CancelToken = axios.CancelTokenlet sources = []const request = function (url, params, config, method) { return new Promise((resolve, reject) => {  axios[method](url, params, Object.assign(config, {   cancelToken: new CancelToken(function executor (c) {    sources.push(c)   })  })).then(response => {   resolve(response.data)  }, err => {   reject(err)  }).catch(err => {   reject(err)  }) })}const post = (url, params, config = {}) => { return request(url, params, config, 'post')}const get = (url, params, config = {}) => { return request(url, params, config, 'get')}export {sources, post, get}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 相关标签:vue教程
  • 本文发布HTML5中文学习网 ,转载请注明出处,感谢您!
  • 相关文章


  • 曝网友假装外国人写投诉信 ofo秒退押金并回函致歉
  • 苹果市值缩水逾2000亿美元 遭多家投行下调目标价
  • Asp.net Core与类库读取配置文件信息的方法_实用技巧
  • asp.net在Repeater嵌套的Repeater中使用复选框详解_实用技巧
  • 利用IIS调试ASP.NET网站程序的完整步骤_实用技巧
  • Asp.Net Core轻松学习系列之配置文件_实用技巧
  • ASP.NET 页生命周期概述(小结)_实用技巧
  • 详解ASP.NET Core WebApi 返回统一格式参数_实用技巧
  • 2018年网络流行语有哪些?2018年十大网络流行语盘点
  • 华为首席财务官孟晚舟被暂扣 深圳市政府要求加方立即放人!
  • 独孤九贱(4)_PHP视频教程

    江湖传言:PHP是世界上最好的编程语言。真的是这样吗?这个梗究竟是从哪来的?学会本课程,你就会明白了。 PHP中文网出品的PHP入门系统教学视频,完全从初学者的角度出发,绝不玩虚的,一切以实用、有用...

    独孤九贱(5)_ThinkPHP5视频教程

    ThinkPHP是国内最流行的中文PHP开发框架,也是您Web项目的最佳选择。《php.cn独孤九贱(5)-ThinkPHP5视频教程》课程以ThinkPHP5最新版本为例,从最基本的框架常识开始,将...

    独孤九贱(1)_HTML5视频教程

    《php.cn原创html5视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了HTML知识。 ...

    ThinkPHP5实战之[教学管理系统]

    本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目。

    PHP入门视频教程之一周学会PHP

    所有计算机语言的学习都要从基础开始,《PHP入门视频教程之一周学会PHP》不仅是PHP的基础部分更主要的是PHP语言的核心技术,是学习PHP必须掌握的内容,任何PHP项目的实现都离不开这部分的内容,通...

    作者信息

    kevin

    永远在学习的路上!

    相关教程

  • javascript初级视频教程 javascript初级视频教程
  • jquery 基础视频教程 jquery 基础视频教程
  • javascript三级联动视频教程 javascript三级联动视频教程
  • 独孤九贱(3)_JavaScript视频教程 独孤九贱(3)_JavaScript视频教程
  • 独孤九贱(6)_jQuery视频教程 独孤九贱(6)_jQuery视频教程
  • 热门教程