# Axios请求封装
在vue2中使用Axios进去异步请求获取数据,我们可以通过对axios实例进行配置来实现对请求的统一拦截和响应处理。
# 一、Axios请求拦截处理
// request.js
import axios from 'axios'
// import store from '@/store'
import storage from 'store'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import notification from 'ant-design-vue/es/notification'
// 创建 axios 实例
const request = axios.create({
// API 请求的默认前缀
baseURL: process.env.VUE_APP_API_BASE_URL,
timeout: 1000 * 60 * 10 // 请求超时时间
})
// 异常拦截处理器
const errorHandler = (error) => {
if (error.response) {
const data = error.response.data
// 对请求状态统一处理
if (error.response.status === 401) {
notification.warning({
message: '授权验证失败',
description: '请重新登录'
})
storage.clearAll()
window.location.reload()
return new Promise(() => {})
}
if (error.response.status === 404) {
notification.warning({
title: '不存在该页面',
message: data.msg
})
return new Promise(() => {})
}
// ...其他状态处理
}
return Promise.reject(error)
}
// request interceptor 请求拦截
request.interceptors.request.use(config => {
const token = storage.get(ACCESS_TOKEN)
// 如果 token 存在
// 让每个请求携带自定义 token 请根据实际情况自行修改
if (token) {
config.headers['Authorization'] = token
}
return config
}, errorHandler)
// response interceptor 请求响应
request.interceptors.response.use((response) => {
return response.data
}, errorHandler)
export default request
# 二、接口分类
对于项目中不同模块的接口,可以专门创建对应的接口处理文件来进行分类处理,这样在调用时只需关注调用哪个接口和传什么参数就行了。在项目中统一在api文件下进行处理接口。
├── src
│ ├── api # Api ajax请求处理
│ │ ├── public.js # 公共接口
│ │ └── empower.js # 登录接口
// empower.js
// 引入request.js进行统一处理
import request from '@/utils/request'
// 接口地址
const api = {
login: '/api/login', // 登录
userInfo: '/api/userInfo', // 获取用户信息
logout: '/api/logout' // 退出登录
}
// 登录
export function loginApi(parameter) {
return request({
url: api.login,
method: 'post',
data: parameter
})
}
// 获取用户信息
export function userInfoApi(parameter) {
return request({
url: api.userInfo,
method: 'get',
params: parameter
})
}
// 退出登录
export function logoutApi(parameter) {
return request({
url: api.logout,
method: 'post',
data: parameter
})
}
# 三、使用
<script>
/**
* @description 登录页面
* @author changz
* */
import storage from 'store'
import { ACCESS_TOKEN } from '@/store/mutation-types'
// 引入接口地址
import { loginApi } from '@/api/empower'
export default {
name: 'Empower',
data() {
return {
codeLoad: false,
submitLoad: false,
pwdType: false,
formData: {
phone: '',
password: '',
code: '',
key: '',
verifyImg: '',
login_type: 2 // 1、管理端登录 2、客户端登录
}
}
},
methods: {
// 登录
submitForm() {
const { phone, password, code, key, login_type } = this.formData
const params = {
phone,
password,
code,
key,
login_type
}
this.submitLoad = true
loginApi(params)
.then(res => {
this.submitLoad = false
if (res.code !== 200) {
this.$notification.warning({
message: '错误',
description: res.msg
})
return
}
const { token } = res.data
storage.set(ACCESS_TOKEN, token, 7 * 24 * 60 * 60 * 1000)
this.$message.success('登录成功')
})
.catch(err => {
this.submitLoad = false
this.$notification.warning({
message: '错误',
description: err.message
})
})
}
}
}
</script>
← Mock假数据 Vue项目添加CSS →