ipink-util
Version:
util.js
119 lines (116 loc) • 4.17 kB
JavaScript
import { HttpConfig, interceptor } from './config.mjs';
import { Storage } from './cache.mjs';
import { HttpStatusCode } from './typing.mjs';
import { log } from './log.mjs';
import get from '../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/get.mjs';
import merge from '../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/merge.mjs';
function createService() {
if (!HttpConfig.axios) {
throw new Error('本包未内置axios,请在外部传入,例如在main.ts中 \nimport axios from "axios"\nConfig.setConfig({\n axios: axios \n})\n//或者 \nHttpConfig.setConfig({\n axios: axios \n})');
}
const service = HttpConfig.axios.create();
service.interceptors.request.use(
// InternalAxiosRequestConfig<any>
(config) => config,
// 发送失败
(error) => Promise.resolve({ ...error || {}, ok: false })
);
service.interceptors.response.use(
(response) => {
response = interceptor("AfterRequest", response);
const apiData = {
...response.data || {},
msg: response.data.msg || response.data.message || response.data.Message || ""
};
const responseType = response.request?.responseType;
if (responseType === "blob" || responseType === "arraybuffer") return apiData;
const code = +apiData[HttpConfig.code_key], ok = code == HttpConfig.code_value;
const finalData = Object.assign(apiData, Object.assign(apiData, { ok }));
if (!ok) {
HttpConfig.toast && HttpConfig.show_toast && HttpConfig.toast(finalData.msg || HttpConfig.default_error_msg);
}
return finalData;
},
(error) => {
const status = get(error, "response.status");
switch (status) {
case HttpStatusCode.BadRequest:
error.msg = "请求错误";
break;
case HttpStatusCode.Unauthorized:
error.msg = "您的登录已过期!";
break;
case HttpStatusCode.Forbidden:
error.msg = "拒绝访问";
break;
case HttpStatusCode.NotFound:
error.msg = "请求地址出错";
break;
case HttpStatusCode.RequestTimeout:
error.msg = "请求超时";
break;
case HttpStatusCode.InternalServerError:
error.msg = "服务器内部错误";
break;
case HttpStatusCode.NotImplemented:
error.msg = "服务未实现";
break;
case HttpStatusCode.BadGateway:
error.msg = "网关错误";
break;
case HttpStatusCode.ServiceUnavailable:
error.msg = "服务不可用";
break;
case HttpStatusCode.GatewayTimeout:
error.msg = "网关超时";
break;
case HttpStatusCode.HttpVersionNotSupported:
error.msg = "HTTP 版本不受支持";
break;
default:
error.msg = "服务器响应错误!";
break;
}
HttpConfig.toast && HttpConfig.show_toast && HttpConfig.toast(error.msg || HttpConfig.default_error_msg);
return Promise.resolve({
...error,
ok: false,
msg: error.msg,
code: status
});
}
);
return service;
}
function createRequest(service) {
return function(config) {
let token;
if (HttpConfig.getToken) {
token = HttpConfig.getToken();
} else {
token = Storage.get(HttpConfig.token_key);
}
const defaultConfig = {
headers: {
// 携带 Token
"Authorization": token ? `${HttpConfig.token_type}${HttpConfig.token_type ? " " : ""}${token}` : "",
"Content-Type": "application/json"
},
timeout: HttpConfig.timeout,
base_url: HttpConfig.base_url + HttpConfig.api_prefix,
method: HttpConfig.default_method,
data: {}
};
log.group(config?.url || "", () => {
log.info("入参:", { ...config.data });
}, true);
let mergeConfig = merge(defaultConfig, config);
mergeConfig = interceptor("BeforeRequest", mergeConfig);
return service(mergeConfig);
};
}
const createHttp = () => {
const service = createService();
return createRequest(service);
};
export { createHttp };