You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

127 lines
3.4 KiB

// src/utils/request.js
import axios from "axios";
1 month ago
import qs from 'qs';
import { handleTokenRefresh } from '@/utils/loginRefresh';
import { host } from '@/config/host';
// 创建 axios 实例
const service = axios.create({
1 month ago
baseURL: 'http://adminnew.pengda.checkcopy.com', // 从环境变量中读取 API 基础地址
timeout: 60000, // 请求超时时间
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
withCredentials: true
});
// 请求拦截器
service.interceptors.request.use(
(config) => {
// 在发送请求之前做一些处理,例如添加 token
const token = localStorage.getItem("token");
if (token) {
5 months ago
config.headers["Auth"] = `${token}`;
}
return config;
},
(error) => {
// 对请求错误做些什么
return Promise.reject(error);
}
);
// 响应拦截器
service.interceptors.response.use(
(response) => {
// 对响应数据做一些处理
const res = response.data;
return response.config.returnFullResponse ? response : res;
// if (!res.status) {
// 如果返回的 status 不是 true,则视为错误
// return Promise.reject(new Error(res.info || "请求失败"));
// }
// response包含内容
// const {
// config, // 包含请求头(config.headers)
// headers, // 响应头(headers)
// data, // 响应体数据
// status // HTTP状态码
// } = response;
},
(error) => {
// 对响应错误做些什么
if (error.response) {
switch (error.response.status) {
case 401:
// 未授权,跳转到登录页
window.location.href = host;
break;
case 402:
// token失效
// 防止无限刷新
if (!error.config._retry) {
error.config._retry = true;
return handleTokenRefresh(error.config, service); // <<< 封装方法
}
break;
case 404:
// 资源未找到
console.error("资源未找到");
break;
case 500:
// 服务器错误
console.error("服务器错误");
break;
default:
console.error("请求失败", error.message);
}
}
return Promise.reject(error);
}
);
/**
* 封装请求方法
* @param {string} method 请求方法 (GET, POST, PUT, DELETE )
* @param {string} url 请求地址
* @param {object} data 请求参数
* @param {object} config 其他 axios 配置
* @returns {Promise} 返回请求结果
*/
const request = (method, url, data = {}, config = {}) => {
const lowerCaseMethod = method.toLowerCase();
if (lowerCaseMethod === "get") {
// GET 请求将参数拼接到 URL 上
return service({
method: "get",
url,
params: data,
...config,
});
} else {
1 month ago
let requestData = data;
// 如果 Content-Type 是 application/x-www-form-urlencoded,进行序列化
if (
config.headers &&
config.headers['Content-Type'] === 'application/x-www-form-urlencoded'
) {
requestData = qs.stringify(data);
} else if (
!config.headers &&
service.defaults.headers['Content-Type'] === 'application/x-www-form-urlencoded'
) {
requestData = qs.stringify(data);
}
// 其他请求(POST, PUT, DELETE 等)将参数放在请求体中
return service({
method: lowerCaseMethod,
url,
1 month ago
data: requestData,
...config,
});
}
};
export default request;