关于axios的一些封装
关于Axios的封装
为何需要在封装
应用场景,项目中涉及100个AJAX
请求,其中:
1.其中60个需要在请求头header设置token headers: {token: token}
用于权限校验;
2.其中20个为上传EXCEL文件需要在请求头中设置Content-Type;
headers: {
'Content-Type': `multipart/form-data; boundary=${data._boundary}`
}
上面说的 1、2、3可以在全局request
拦截中进行处理,但是代价极大,需要为这100个接口都做判断再做相应处理... ;当然也可以不用全局拦截,为每个接口都单独定义,我相信有不少同学仍是这样处理的,但是只要有改动,例如现在我要求所有的请求头都新增一个参数,那就只能一个一个接口的改.....这不是我们想要的结果,所以 我们需要对AJAX再封装!AJAX再封装!AJAX再封装!,因为相当重要,所以要多说几遍....
③最后20个请求用来
获取文件流
,需要指定接受类型responseType: 'blob'
需要对全局发起request进行拦截并做异步处理(强调:是异步处理);
如果你的项目已经做到一半,现在后端要加上token权限做认证;
封装实现
封装其实很简单,就是对原来真正的AJAX套一个壳,这个壳就是一个函数! 在这个函数里都干了些什么见不得人事呢?干什么都可以,上面说的1、 2、 3、 4、 5都可以在这里悄悄的进行,那对原来的AJAX链式调用有影响吗?答案是肯定的:没有影响。 先来看看我在代码里调用的AJAX:
_initEditParams () {
this.$axios('Common/Permission/Get', {Id}).then(res => {
....
....
})
},
this.$axios可以直接调用是因为这里把请求方法之类的配置项全放在封装里面进行了。
这里也是通过Vue.prototype.$axios = axios
添加到vue全局实例的,但这里添加的axios
不是直接引入的axios插件,而是一个方法
import {axios} from './utils/common'
Vue.prototype.$axios = axios
当然。也可以不用添加到全局实例里面,可以在组件中通过import
语法引入使用。当然是项目里大量使用的封装方法直接使用Vue.prototype
添加到vue
实例。接下来我们看看axios方法都做了些啥:
import Axios from 'axios'
import Store from '../vuex'
/*********************************
** Fn: axios
** Intro: 公用封装的axios 已在main.js中进行 $axios代理
** Intro: Store.state.permission.constUrl 为公用的接口前缀地址
** Intro: url 方法接受参数 为定义的 接口地址后缀
** Intro: data 方法接受参数 为定义的参数
** Author: zyx
*********************************/
export function axios (url, data) {
return new Promise((resolve, reject) => {
Axios({
url: `${Store.state.permission.constUrl}${url}`,
method: 'post',
data: data,
headers: {
token: Store.state.permission.token
}
}).then(res => {
resolve(res)
}).catch(err => {
reject(err)
})
})
}
Axios的封装
在目录下新建一个Axios文件夹,在文件夹下新建文件axios.js,文件内容:
import Axios from "axios";
import qs from "qs";
import router from "@/router/router.js";
// import { Message } from "element-ui";
/****** 创建axios实例 ******/
const Service = Axios.create({
baseURL: process.env.BASE_URL, // api的base_url
timeout: 10000, // 请求超时时间
responseType: "json",
withCredentials: true, // 是否允许带cookie这些
headers: {
// "Content-Type": "application/x-www-form-urlencoded;charset=utf-8"
"Content-Type": "application/json;charset=utf-8"
}
});
// 设置请求拦截器
Service.interceptors.request.use(config => {
// 在发送请求之前做某件事
if (config.method === "post") {
// 序列化
// config.data = qs.stringify(config.data);
// config.data = JSON.stringify(config.data);
// 温馨提示,若是公司的提交能直接接受json 格式,可以不用 qs 来序列化的
}
// 若是有做鉴权token , 就给头部带上token
// 若是需要跨站点,存放到 cookie 会好一点,限制也没那么多,有些浏览环境限制了 localstorage 的使用
// if (localStorage.token) {
// config.headers.Authorization = localStorage.token;
// }
return config;
},
error => {
// error 的回调信息,看公司的定义
Message({
showClose: true,
message: error,
type: "warning"
});
return Promise.reject(error);
})
// 响应拦截 http 请求回来的一些状态码,包括我们自己的服务器返回的错误码进行一个逻辑处理。
Service.interceptors.response.use(res => {
//对响应数据做些事
// if (res.data && !res.data.success) {
// Message({
// // 饿了么的消息弹窗组件,类似toast
// showClose: true,
// message: res.data.error.message.message ?
// res.data.error.message.message :
// res.data.error.message,
// type: "error"
// });
// return Promise.reject(res.data.error.message);
// }
return res;
}, (error) => {
// 错误处理方式1:
// if (error.data) {
// switch (error.data.code) {
// case 401:
// // 返回 401 清除token信息并跳转到登录页面
// // store.commit("del_token");
// router.push({
// path: "/login",
// // 记录原来的页面路径用于登录后调回原页面
// query: {
// redirect: router.currentRoute.fullPath
// }
// });
// break;
// }
// }
// 错误处理方式2:
// 用户登录的时候会拿到一个基础信息,比如用户名,token,过期时间戳
// 直接丢localStorage或者sessionStorage
if (!window.localStorage.getItem("username")) {
// 若是接口访问的时候没有发现有鉴权的基础信息,直接返回登录页
router.push({
path: "/login"
});
} else {
// 下面是接口回调的satus ,因为我做了一些错误页面,所以都会指向对应的报错页面
if (error.response.status === 403) {
router.push({
path: "/error/403"
});
}
if (error.response.status === 500) {
router.push({
path: "/error/500"
});
}
if (error.response.status === 502) {
router.push({
path: "/error/502"
});
}
if (error.response.status === 404) {
router.push({
path: "/error/404"
});
}
}
// 返回 response 里的错误信息
let errorInfo = error.data.error ? error.data.error.message : error.data;
return Promise.reject(errorInfo);
})
//封装后导出
export default Service;
这种方法使用方式有两种:
使用方式1:
1:全局配置:在main.js文件里导入封装的axios文件
import axios from '@/Axios/axios';
2:绑定到Vue实例
Vue.prototype.$axios= axios; //在其他vue组件中就可以this.axios调用使用:
3:在需要使用的单文件VUE组件里面直接使用(因为是全局配置,在使用的单文件里面不需要引入)
this.$axios.get(url,{params:{ID:888}}).then(res=>{}).catch(error=>{})
this.$axios.post(url,{id:888,name:"sdsdsd"}).then(res=>{}).catch(error=>{})
使用方式2:
在Axios文件夹下(或者其他文件夹)先新建一个api(任意名称)文件:api.js
1:该文件里面下业务接口请求相关的函数:
// 封装后使用的方式
import request from "@/Axios/axios.js"
export function tableList(query){
return request({
url: 'http://yapi.demo.qunar.com/mock/27844/apitest/list',
method: 'get',
params: query
})
}
export function goodsList(query){
return request({
url: 'http://yapi.demo.qunar.com/mock/27844/apitest/list',
method: 'get',
params: query
})
}
2:在需要使用的单文件里面导入需要调用的接口函数
比如:home.vue单文件里面
<template>
<div class="mainBox">
<table-component v-if="data.length>0" :goodslist="data"></table-component>
</div>
</template>
<style rel="stylesheet/scss" lang="scss" scoped></style>
<script>
// 导入接口函数
import {tableList} from "../Axios/api.js" ;
import tableComponent from "@/view/table/table";
export default {
data() {
return {
data:[]
}
},
mounted() {
this.getData()
},
methods:{
getData(){
//使用接口函数
tableList().then(res=>{
console.log(res.data);
this.data = res.data.list
})
}
},
components: {
tableComponent
},
}
</script>
关于axios的一些封装的更多相关文章
- 原生 Ajax 封装 和 Axios 二次 封装
AJAX 异步的JavaScript与XML技术( Asynchronous JavaScript and XML ) Ajax 不需要任何浏览器插件,能在不更新整个页面的前提下维护数据,但需要用户允 ...
- axios 二次封装
一般项目往往要对 axios 库进行二次封装,添加一些自定义配置和拦截器等 案例 ./service/axios.js 1234567891011121314151617181920212223242 ...
- 【vue】axios二次封装,更好的管理api接口和使用
在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...
- 十. Axios网络请求封装
1. 网络模块的选择 Vue中发送网络请求有非常多的方式,那么在开发中如何选择呢? 选择一:传统的Ajax是基于XMLHttpRequest(XHR) 为什么不用它呢?非常好解释配置和调用方式等非常混 ...
- axios请求的封装
/* axios的请求封装 */ //axios的原生写法get,post请求 //第一个参数为请求地址,第二个参数为请求的参数,params是将参数拼接在url的后面 ...
- 基于SqlSugar的开发框架循序渐进介绍(10)-- 利用axios组件的封装,实现对后端API数据的访问和基类的统一封装处理
在SqlSugar的开发框架的后端,我们基于Web API的封装了统一的返回结果,使得WebAPI的接口返回值更加简洁,而在前端,我们也需要统一对返回的结果进行解析,并获取和Web API接口对应的数 ...
- vue2 axios 接口函数封装
封装 axios 工具,编辑 src/api/index.js 文件 首先,我们要使用 axios 工具,就必须先安装 axios 工具.执行下面的命令进行安装 npm install axios - ...
- axios的简单封装及在组件内使用
/**第一步 * 配置编译环境和线上环境之间的切换 * baseUrl: 域名地址 * routerMode: 路由模式 * imgBaseUrl: 图片所在域名地址 * */ let Host = ...
- axios 是如何封装 HTTP 请求的
原载于 TutorialDocs 网站的文章<How to Implement an HTTP Request Library with Axios>.译者:zhangbao90shttp ...
随机推荐
- Notepad++搜索中的正则应用
假设要查找文件中所有tppabs="*****" 类型的代码 tppabs="http://www.******.com/templates/Alen/Css/Main. ...
- SQLAlchemy中filter和filer_by的区别
filter: session.query(MyClass).filter(MyClass.name == 'some name') filter_by: session.query(MyClass) ...
- Timer和DispatcherTimer简单使用
1. 设定计时器相关属性,使用委托方法处理事件触发 DispatcherTimer dispatcherTimer= new DispatcherTimer(); dispatcherTimer.Ti ...
- 安装软件时候出现"无效驱动器D"
安装软件的时候,出现以下问题. 如图: 无效驱动器 原因是因为之前安装过这样的软件在H盘,后期更改没了H,所以出现了错误. 解决方案: 打开注册表,搜索软件的关键字如 vmware 删除错误路径即 ...
- Codeforces 432C
题目链接 题意: 给出一个长度为n(n<=10^5)的数组a, 数组a是数字1到n的一种排列(打乱顺序). 每次可以选择两个数(不同)进行交换, 但是交换的条件是被选择的两个数的下标之差加1应 ...
- framework7日期插件使用
1.引入框架文件 <link rel="stylesheet" href="framework7.ios.min.css"> <link re ...
- UVALive - 4787 ICPC WF 2010 Tracking Bio-bots【dp】
UVa 4787 WF题果然不一样,本来想暴力搜索,数据太大了,数组都开不了.看题解也不太懂,记录一下书上的题解,以后再看: 此题是给出N*M的格子,有些地方是墙,不可走.求所有不能只通过向上或者向右 ...
- java基础部分的一些有意思的东西。
${li.key!=''&&li.key!= null}可以直接判断不为空 ${empty li.value}也是不为空. 最近好烦迭代map里的map或者map里的list 后来发现 ...
- Flask学习之十 全文搜索
英文博客地址:blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-x-full-text-search 中文翻译地址:http://ww ...
- oracle函数 trunc(x[,y])
[功能]返回x按精度y截取后的值 [参数]x,y,数字型表达式,如果y不为整数则截取y整数部分,如果y>0则截取到y位小数,如果y小于0则截取到小数点向左第y位,小数前其它数据用0表示. [返回 ...