99 lines
2.9 KiB
JavaScript
99 lines
2.9 KiB
JavaScript
import axios from 'axios'
|
||
import { ElMessage } from 'element-plus'
|
||
|
||
|
||
axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
||
// 创建axios实例
|
||
const service = axios.create({
|
||
// axios中请求配置有baseURL选项,表示请求URL公共部分
|
||
baseURL: import.meta.env.VITE_APP_BASE_API,
|
||
// 超时
|
||
timeout: 10000
|
||
})
|
||
|
||
// request拦截器
|
||
service.interceptors.request.use(config => {
|
||
// 过滤掉参数值为空的参数项
|
||
if (config.params) {
|
||
config.params = filterEmptyParams(config.params);
|
||
}
|
||
|
||
if (config.data && typeof config.data === 'object') {
|
||
// 根据Content-Type处理不同格式的数据
|
||
if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded') {
|
||
// 表单编码数据需要特殊处理
|
||
config.data = filterFormData(config.data);
|
||
} else {
|
||
config.data = filterEmptyParams(config.data);
|
||
}
|
||
}
|
||
|
||
return config
|
||
}, error => {
|
||
console.log(error)
|
||
Promise.reject(error)
|
||
})
|
||
|
||
/**
|
||
* 过滤空值参数
|
||
* @param {Object} params 参数对象
|
||
* @returns {Object} 过滤后的参数对象
|
||
*/
|
||
function filterEmptyParams(params) {
|
||
const filtered = {};
|
||
for (const key in params) {
|
||
const value = params[key];
|
||
// 保留非空值:非null、非undefined、非空字符串、非空数组
|
||
if (value !== null && value !== undefined && value !== '') {
|
||
if (Array.isArray(value) && value.length === 0) {
|
||
continue; // 跳过空数组
|
||
}
|
||
filtered[key] = value;
|
||
}
|
||
}
|
||
return filtered;
|
||
}
|
||
|
||
/**
|
||
* 过滤表单编码数据
|
||
* @param {Object|string} data 表单数据
|
||
* @returns {string} 过滤后的表单字符串
|
||
*/
|
||
function filterFormData(data) {
|
||
if (typeof data === 'string') {
|
||
// 如果是字符串,尝试解析为URLSearchParams
|
||
const params = new URLSearchParams(data);
|
||
for (const [key, value] of params.entries()) {
|
||
if (value === '' || value === 'null' || value === 'undefined') {
|
||
params.delete(key);
|
||
}
|
||
}
|
||
return params.toString();
|
||
} else if (typeof data === 'object') {
|
||
// 如果是对象,先过滤空值再转换为URLSearchParams
|
||
const filtered = filterEmptyParams(data);
|
||
return new URLSearchParams(filtered).toString();
|
||
}
|
||
return data;
|
||
}
|
||
|
||
// 响应拦截器
|
||
service.interceptors.response.use(res => {
|
||
const code = res.data.errorCode || 0
|
||
const msg = res.data.errorMsg || ''
|
||
if (code === 20000) {
|
||
ElMessage({ message: msg, type: 'error' })
|
||
} else {
|
||
return Promise.resolve(res.data)
|
||
}
|
||
},
|
||
error => {
|
||
console.log('err' + error)
|
||
let { message } = error
|
||
ElMessage({ message: message, type: 'error', duration: 5 * 1000 })
|
||
return Promise.reject(error)
|
||
}
|
||
)
|
||
|
||
export default service
|