# request axios
# 依赖
yarn add axios
yarn add element
1
2
2
# 目录结构
|-- src
|-- |-- utils
|-- |-- | |--request.js
1
2
3
2
3
# 用法
import request from '@/utils/request'
export function getDemoTestList (params) {
return request({
url: '/api/demo_test/list',
method: 'get',
params
})
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 实现 (opens new window)
import axios from 'axios'
import { Message } from 'element-ui'
import { getCookieToken } from '@/utils/cookie'
import { camelizeKeys, decamelizeKeys } from '@/utils/camelCase'
import Router from '@/router/index'
// redirect error
function errorRedirect (url) {
Router.push(`/${url}`)
}
// code Message
const codeMessage = {
200: '服务器成功返回请求的数据。',
201: '新建或修改数据成功。',
202: '一个请求已经进入后台排队(异步任务)。',
204: '删除数据成功。',
206: '进行范围请求成功。',
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
401: '用户没有权限(令牌、用户名、密码错误)。',
403: '用户得到授权,但是访问是被禁止的。',
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
406: '请求的格式不可得。',
410: '请求的资源被永久删除,且不会再得到的。',
422: '当创建一个对象时,发生一个验证错误。',
500: '服务器发生错误,请检查服务器。',
502: '网关错误。',
503: '服务不可用,服务器暂时过载或维护。',
504: '网关超时。'
}
// 创建axios实例
const service = axios.create({
// api 的 base_url
baseURL: process.env.VUE_APP_BASE_API,
// 请求超时时间
timeout: 15000
})
// request拦截器
service.interceptors.request.use(
request => {
// Conversion of hump nomenclature
request.data = decamelizeKeys(request.data)
request.params = decamelizeKeys(request.params)
/**
* 让每个请求携带自定义 token
* 请根据实际情况自行修改
*/
if (getCookieToken()) {
request.headers.Authorization = `Bearer ${getCookieToken()}`
}
return request
},
error => {
return Promise.reject(error)
}
)
// respone拦截器
service.interceptors.response.use(
response => {
/**
* response data
* {
* data: {},
* msg: "",
* error: 0 0 success | 1 error | 5000 failed | HTTP code
* }
*/
// Conversion of hump nomenclature
const data = response.data
return camelizeKeys(data)
},
error => {
/**
* 某些特定的接口 404 500 需要跳转
* 在需要重定向的接口中传入 redirect字段 值为要跳转的路由
* redirect之后 调用接口的地方会继续执行
* 因为此时 response error
* 所以需要前端返回一个前端构造好的数据结构 避免前端业务部分逻辑出错
* 不重定向的接口则不需要传
*/
if (error.config.redirect) {
errorRedirect(error.config.redirect)
}
if (error.response) {
Message({
message: codeMessage[error.response.status] || error.response.data.message,
type: 'error',
duration: 3 * 1000,
showClose: true
})
return {
data: {},
error: error.response.status,
msg: codeMessage[error.response.status] || error.response.data.message
}
} else {
// failed
Message({
message: error.message,
type: 'error',
duration: 5 * 1000,
showClose: true
})
// 某些特定的接口 failed 需要跳转
return {
data: {},
error: 5000,
msg: '服务请求不可用,请重试或检查您的网络。'
}
}
}
)
export function sleep (time = 0) {
return new Promise((resolve) => {
setTimeout(() => {
resolve({})
}, time)
})
}
export default service
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127