| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- import axios, {AxiosInstance, AxiosRequestConfig, AxiosResponse} from 'axios';
- import {Session} from '/@/utils/storage';
- import {useMessageBox} from '/@/hooks/message';
- import qs from 'qs';
- import other from './other';
- /**
- * 创建并配置一个 Axios 实例对象
- */
- const service: AxiosInstance = axios.create({
- baseURL: import.meta.env.VITE_API_URL,
- timeout: 50000, // 全局超时时间
- paramsSerializer: (params: any) => {
- return qs.stringify(params, { arrayFormat: 'repeat' });
- }
- });
- /**
- * Axios请求拦截器,对请求进行处理
- * 1. 序列化get请求参数
- * 2. 统一增加Authorization和TENANT-ID请求头
- * 3. 自动适配单体、微服务架构不同的URL
- * @param config AxiosRequestConfig对象,包含请求配置信息
- */
- service.interceptors.request.use(
- (config: AxiosRequestConfig) => {
- // 统一增加Authorization请求头, skipToken 跳过增加token
- const token = Session.getToken();
- if (token && !config.headers?.skipToken) {
- config.headers![CommonHeaderEnum.AUTHORIZATION] = `Bearer ${token}`;
- }
- // 请求报文加密
- if(config.method == "get"){
- let newParam = config.params || {};
- const enc = other.encryption(JSON.stringify(newParam));
- config.params = {
- value: encodeURI(enc)
- }
- }
- if(config.method == "post" || config.method == "put"){
- let data = config.data;
- config.data = other.encryption(JSON.stringify(data))
- config.headers!['Content-Type'] = 'application/json'
- }
- // 自动适配单体和微服务架构不同的URL
- config.url = other.adaptationUrl(config.url);
- // 处理完毕,返回config对象
- return config;
- },
- (error) => {
- // 对请求错误进行处理
- return Promise.reject(error);
- }
- );
- /**
- * 响应拦截器处理函数
- * @param response 响应结果
- * @returns 如果响应成功,则返回响应的data属性;否则,抛出错误或者执行其他操作
- */
- const handleResponse = (response: AxiosResponse<any>) => {
- if (response.data.code === 1) {
- throw response.data;
- }
- // 针对密文返回解密
- if (response.data.encryption) {
- const originData = JSON.parse(other.decryption(response.data.encryption));
- response.data = originData;
- return response.data;
- }
- return response.data;
- };
- /**
- * 添加 Axios 的响应拦截器,用于全局响应结果处理
- */
- service.interceptors.response.use(handleResponse, (error) => {
- console.log(error)
- const status = Number(error.response.status) || 200;
- if (status === 424) {
- useMessageBox()
- .confirm('令牌状态已过期,请点击重新登录')
- .then(() => {
- Session.clear(); // 清除浏览器全部临时缓存
- window.location.href = '/'; // 去登录页
- return;
- });
- }
- return Promise.reject(error.response.data);
- });
- // 常用header
- export enum CommonHeaderEnum {
- 'TENANT_ID' = 'TENANT-ID',
- 'ENC_FLAG' = 'Enc-Flag',
- 'AUTHORIZATION' = 'Authorization',
- }
- // 导出 axios 实例
- export default service;
|