RESCUEWeb/src/utils/request.js

99 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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