# 封装 axios
axios 一个很常用的 Vue 或 react 项目中使用的第三方请求接口的库 接下来分享一下平时自己业务项目中,怎么封装 axios
# 首先用 crate 创建一个实例
const request = axios.create({
baseURL: 'https://xxxx',
timeout: 100000,
headers: {
"Content-type": "application/json;charset=UTF-8",
}
})
export default request
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- 一般会用到上面这几个参数
- baseURL:将自动加在 'url' 前面,例如你可以放公司接口域名前缀,但会用到本地,测试,线上环境的 URL 地址不同,需要通过参数来判断
const { NODE_ENV } = process.env const HOST = { development: 'http://192.168.1.111:8080', production: 'https://xxxx.com' }[NODE_ENV]
1
2
3
4
5- timeout:接口请求的超时时间
- headers:自定义的请求头
# 添加请求前的拦截器
- 例如,我们常用的请求前加 loading 效果,就可以这么写
request.interceptors.request.use(
request => {
// 这里调用 loading 组件
// loading 可以自己实现,或者用第三方组件库
Toast.loading('Loading...', 0)
return request
},
error => {
// 如果报错,对错误进行处理
}
)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 添加响应的拦截器
- 我们可以在这里处理,服务端的正确返回结果,或者优化接口报错提醒,关闭 loading 效果,增加错误埋点等。 详细看下面每行代码注释
request.interceptors.response.use(
response => {
// 例如,服务端状态是 200 时,关闭 loading 效果,返回 response
if (response.data.status === 200) {
Toast.hide()
return response
} else {
// 一般服务端不会返回直接系统级 的报错状态吗,例如返回 2000 ,表示接口请求报错
Toast.hide()
// 关闭loading效果,弹出 message 组件,告诉用户哪里出错了
this.$message('xxxx')
// 还可以增加埋点,方便我们排查错误
}
},
// 这里处理 系统 报错,例如: 500,400,403 等
error => {
// 同样,需要关闭 loading
Toast.hide()
// 处理 500 的报错
if (error.response && error.response.status === 500) {
Message.error(JSON.stringify(error.response.data))
} else if (error.response && error.response.status === 413) {
Message.error('文件太大啦!')
}
}
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 增加默认值
- 例如:把登陆之后后端返回的 token 塞到 header 里面
request.defaults.headers.common['accesstoken'] = token
1
request 是 axios.create() 创建后返回的实例
# 在项目中使用
- 使用 async await 的方式 例如:在 Vue mounted 生命周期里
async mounted() {
const { data } = await request.post('/api/xxx', ...params)
}
1
2
3
2
3
- request.post 请求的方式,有 get,delete,put 等
- params 需要传递给接口的参数
- data 接口的返回结果
# 最后封装 axios 完成的代码
- 可自行根据业务需求添加,我分享出来整体的结构
import axios from 'axios'
import { Message } from 'element-ui'
const { NODE_ENV } = process.env
const HOST = {
development: 'http://192.168.1.xxx:8080',
production: 'https://xxx'
}[NODE_ENV]
export const request = axios.create({
baseURL: HOST,
timeout: 10000,
headers: {
'Content-Type': 'application/json; charset=utf-8',
}
})
request.interceptors.request.use(
req => {
Toast.loading('Loading...', 0)
return req
},
error => {
return error
}
)
request.interceptors.response.use(
response => {
if (response.data.status === 200) {
Toast.hide()
return response
} else {
Message.error(JSON.stringify(response.data.message))
return Promise.reject(response)
}
},
error => {
if (error.response && error.response.status === 500) {
Message.error(JSON.stringify(error.response.data))
}
return Promise.reject(error)
}
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45