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>
业务场景:
默认配置
定义全局的默认配置
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)})
新闻热点
疑难解答
图片精选