显然,这个问题的核心在于 axios 的封装和使用。
封装
我们首先来看看封装,这个很好找,要么是 services 要么是 request,很快就定位到了具体的文件:utils/request.js
:
简单分析一下,不难看出,整个文件大致宏观框架如下:
const service = axios.create({/*...*/})
service.interceptors.request.use(onFulfilled, onRejected)
service.interceptors.response.use(onFulfilled, onRejected)
export default service
整体的思路是:创建实例 → 添加请求和响应拦截器 → 导出实例。
下面具体看看这几步:
创建实例
const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
})
没什么好说的,设定了 baseURL
和 timeout
,当然 axios 还有非常多其他的配置,这里以分析 vue-element-admin 学习经验为主要目的,就不罗列其他属性,感兴趣的读者可以自行查阅:axios 中文文档 - 请求配置
请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['X-Token'] = getToken()
}
return config
},
error => {
console.log(error)
return Promise.reject(error)
}
)
显然,请求拦截器的核心功能就是为请求加上 token 信息。
响应拦截器
service.interceptors.response.use(
response => {
const res = response.data
if (res.code !== 20000) {
Message({
message: res.message || 'Error',
type: 'error',
duration: 5 * 1000
})
if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
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)
Message({
message: error.message,
type: 'error',
duration: 5 * 1000
})
return Promise.reject(error)
}
)
响应拦截器的主要功能则是做各种错误处理。
至此,不难看出,axios 的封装,核心思路如下:
创建实例,设定 baseURL
和timeout
在请求拦截器中设定 token 在响应拦截器中做错误处理,包括 token 失效清空信息以及各种错误提示等
那么,如何在项目中使用网络请求呢?
其实这个问题也是相当简单就能找到答案得:/api
,所有的 api 请求都在这里成模块的封装,随便抽一个看看就明白了:
import request from '@/utils/request'
export function fetchList(query) {
return request({
url: '/vue-element-admin/article/list',
method: 'get',
params: query
})
}
最后补上脑图:
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!