文章目录
1. 引言
- 1. 引言
- 2. 网络请求共性
- 3. axios封装
在前面的章节,已经讲解了部分vue-element-admin的知识:
- 《Vue项目实战(01)-vue-element-admin项目结构分析》
- 《Vue项目实战(02)-Vuex状态管理模式》
- 《Vue项目实战(03)-alias》
本文主要讲解的是axios
,在前面已简单的讲解过《Java程序员从零开始学Vue(12)- 异步通信(Axios)》,但是本文讲解的是封装后的axios
。
我们都知道网络请求都有共同的操作,如:
- 每一个请求都是要带
token
来验证权限的 - 统一的请求或响应异常处理
那么我们有必要把axios再进行一次封装,在vue-element-admin项目是怎样封装的呢?下面来看看。
3. axios封装vue-element-admin把axios
封装成了一个request.js
工具类,其内容如下:
import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
// 创建一个 axios 实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
// withCredentials: true, // send cookies when cross-domain requests
timeout: 5000 // request timeout
})
// 请求拦截器
service.interceptors.request.use(
config => {
// do something before request is sent
if (store.getters.token) {
// let each request carry token
// ['X-Token'] is a custom headers key
// please modify it according to the actual situation
config.headers['X-Token'] = getToken()
}
return config
},
error => {
// do something with request error
console.log(error) // for debug
return Promise.reject(error)
}
)
// 响应拦截器
service.interceptors.response.use(
/**
* If you want to get http information such as headers or status
* Please return response => response
*/
/**
* Determine the request status by custom code
* Here is just an example
* You can also judge the status by HTTP Status Code
*/
response => {
const res = response.data
// if the custom code is not 20000, it is judged as an error.
if (res.code !== 20000) {
Message({
message: res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
// to re-login
MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
confirmButtonText: 'Re-Login',
cancelButtonText: 'Cancel',
type: 'warning'
}).then(() => {
store.dispatch('user/resetToken').then(() => {
location.reload()
})
})
}
return Promise.reject(new Error(res.message || 'Error'))
} else {
return res
}
},
error => {
console.log('err' + error) // for debug
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
export default service
那么,该如何调用呢?调用方式如下:
import request from '@/utils/request'
//使用
export function getInfo(params) {
return request({
url: '/user/info',
method: 'get',
params
});
}
本文完!