-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathrequest.js
More file actions
157 lines (139 loc) · 3.35 KB
/
request.js
File metadata and controls
157 lines (139 loc) · 3.35 KB
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
* 基础请求工具
* 封装axios,提供统一的请求处理和错误处理
*/
import axios from 'axios'
import { API_CONFIG, RESPONSE_CODES } from './config'
// 创建axios实例
const request = axios.create({
baseURL: API_CONFIG.BASE_URL,
timeout: API_CONFIG.TIMEOUT,
headers: API_CONFIG.HEADERS
})
// 请求拦截器
request.interceptors.request.use(
(config) => {
// 添加认证token(如果存在)
const token = localStorage.getItem('token')
if (token) {
config.headers.Authorization = `Bearer ${token}`
}
// 添加时间戳防止缓存
if (config.method === 'get') {
config.params = {
...config.params,
_t: Date.now()
}
}
console.log('API Request:', config.method?.toUpperCase(), config.url, config.params || config.data)
return config
},
(error) => {
console.error('Request Error:', error)
return Promise.reject(error)
}
)
// 响应拦截器
request.interceptors.response.use(
(response) => {
const { data, status } = response
console.log('API Response:', response.config.url, data)
// 检查HTTP状态码
if (status !== 200) {
throw new Error(`HTTP Error: ${status}`)
}
// 检查业务状态码
if (data.code && data.code !== RESPONSE_CODES.SUCCESS) {
throw new Error(data.msg || `Business Error: ${data.code}`)
}
return data
},
(error) => {
console.error('Response Error:', error)
// 处理网络错误
if (!error.response) {
throw new Error('网络连接失败,请检查网络设置')
}
// 处理HTTP错误状态码
const { status } = error.response
switch (status) {
case 404:
throw new Error('请求的资源不存在')
case 500:
throw new Error('服务器内部错误')
case 401:
throw new Error('未授权访问')
case 403:
throw new Error('访问被禁止')
default:
throw new Error(`请求失败: ${status}`)
}
}
)
/**
* 通用请求方法
* @param {string} url - 请求URL
* @param {object} options - 请求选项
* @returns {Promise} 请求结果
*/
export const apiRequest = async (url, options = {}) => {
try {
const response = await request({
url,
...options
})
return response
} catch (error) {
console.error('API Request Failed:', error.message)
throw error
}
}
/**
* GET请求
* @param {string} url - 请求URL
* @param {object} params - 查询参数
* @returns {Promise} 请求结果
*/
export const get = (url, params = {}) => {
return apiRequest(url, {
method: 'GET',
params
})
}
/**
* POST请求
* @param {string} url - 请求URL
* @param {object} data - 请求数据
* @returns {Promise} 请求结果
*/
export const post = (url, data = {}) => {
return apiRequest(url, {
method: 'POST',
data
})
}
/**
* PUT请求
* @param {string} url - 请求URL
* @param {object} data - 请求数据
* @returns {Promise} 请求结果
*/
export const put = (url, data = {}) => {
return apiRequest(url, {
method: 'PUT',
data
})
}
/**
* DELETE请求
* @param {string} url - 请求URL
* @param {object} params - 查询参数
* @returns {Promise} 请求结果
*/
export const del = (url, params = {}) => {
return apiRequest(url, {
method: 'DELETE',
params
})
}
export default request