Files
certd/packages/ui/certd-client/src/api/service.ts

159 lines
4.5 KiB
TypeScript
Raw Normal View History

2023-01-29 13:44:19 +08:00
import axios from "axios";
2023-06-29 17:20:47 +08:00
import { get } from "lodash-es";
2023-01-29 13:44:19 +08:00
import Adapter from "axios-mock-adapter";
2024-10-03 01:29:12 +08:00
import { errorLog, errorCreate, response } from "./tools";
2023-01-29 13:44:19 +08:00
import { env } from "/src/utils/util.env";
import { useUserStore } from "../store/modules/user";
/**
* @description
*/
function createService() {
// 创建一个 axios 实例
const service = axios.create();
// 请求拦截
service.interceptors.request.use(
(config) => config,
(error) => {
// 发送失败
console.log(error);
return Promise.reject(error);
}
);
// 响应拦截
service.interceptors.response.use(
(response) => {
if (response.config.responseType === "blob") {
return response;
}
//@ts-ignore
if (response.config.returnResponse) {
return response;
}
2023-01-29 13:44:19 +08:00
// dataAxios 是 axios 返回数据中的 data
const dataAxios = response.data;
2024-11-01 00:59:09 +08:00
// @ts-ignore
2024-11-01 00:59:09 +08:00
if (response.config.unpack === false) {
//如果不需要解包
return dataAxios;
}
2023-01-29 13:44:19 +08:00
// 这个状态码是和后端约定的
const { code } = dataAxios;
// 根据 code 进行判断
if (code === undefined) {
2023-06-27 09:29:43 +08:00
// 如果没有 code 代表这不是项目后端开发的接口
2023-01-29 13:44:19 +08:00
errorCreate(`非标准返回:${dataAxios} ${response.config.url}`);
return dataAxios;
} else {
// 有 code 代表这是一个后端接口 可以进行进一步的判断
switch (code) {
case 0:
// [ 示例 ] code === 0 代表没有错误
// @ts-ignore
return dataAxios.data;
default:
// 不是正确的 code
2025-03-09 16:22:22 +08:00
const errorMessage = dataAxios.msg || dataAxios.message || "未知错误";
// @ts-ignore
if (response?.config?.onError) {
// @ts-ignore
response.config.onError(new Error(errorMessage));
}
2024-10-22 18:46:29 +08:00
//@ts-ignore
const showErrorNotify = response?.config?.showErrorNotify;
errorCreate(`${errorMessage}: ${response.config.url}`, showErrorNotify);
2023-01-29 13:44:19 +08:00
return dataAxios;
}
}
},
(error) => {
const status = get(error, "response.status");
switch (status) {
case 400:
error.message = "请求错误";
break;
case 401:
error.message = "未授权,请登录";
break;
case 403:
error.message = "拒绝访问";
break;
case 404:
2024-12-02 23:17:40 +08:00
error.message = `请求地址出错`;
2023-01-29 13:44:19 +08:00
break;
case 408:
error.message = "请求超时";
break;
case 500:
error.message = "服务器内部错误";
break;
case 501:
error.message = "服务未实现";
break;
case 502:
error.message = "网关错误";
break;
case 503:
error.message = "服务不可用";
break;
case 504:
error.message = "网关超时";
break;
case 505:
error.message = "HTTP版本不受支持";
break;
default:
break;
}
2024-12-02 23:17:40 +08:00
error.message += `: ${error.response?.config?.url}`;
2024-10-22 18:46:29 +08:00
errorLog(error, error?.response?.config?.showErrorNotify);
2023-01-29 13:44:19 +08:00
if (status === 401) {
2025-03-09 01:08:57 +08:00
const userStore = useUserStore();
userStore.logout();
2023-01-29 13:44:19 +08:00
}
2024-10-03 01:29:12 +08:00
if (error?.config?.onError) {
error.config.onError(error);
}
2023-01-29 13:44:19 +08:00
return Promise.reject(error);
}
);
return service;
}
/**
* @description
* @param {Object} service axios
*/
2023-06-25 15:30:18 +08:00
function createRequestFunction(service: any) {
return function (config: any) {
2023-01-29 13:44:19 +08:00
const configDefault = {
headers: {
"Content-Type": get(config, "headers.Content-Type", "application/json")
},
2024-10-26 19:56:26 +08:00
timeout: 20000,
2023-01-29 13:44:19 +08:00
baseURL: env.API,
data: {}
};
const userStore = useUserStore();
const token = userStore.getToken;
if (token != null) {
// @ts-ignore
configDefault.headers.Authorization = token;
}
return service(Object.assign(configDefault, config));
};
}
// 用于真实网络请求的实例和请求方法
export const service = createService();
export const request = createRequestFunction(service);
// 用于模拟网络请求的实例和请求方法
export const serviceForMock = createService();
export const requestForMock = createRequestFunction(serviceForMock);
// 网络请求数据模拟工具
export const mock = new Adapter(serviceForMock, { delayResponse: 200 });