UNPKG

ipink-util

Version:

util.js

119 lines (116 loc) 4.17 kB
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 };