RESCUEWeb/src/utils/request.js

99 lines
2.9 KiB
JavaScript
Raw Normal View History

2025-09-08 10:02:48 +08:00
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