UNPKG

@alicloud/console-request-interceptor

Version:

axios request interceptor for one-console

207 lines (151 loc) 7.84 kB
function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } import { getSecToken, getUmid, getCollina, getFecsToken, getFecsUmid, getCurrentRegionId } from '@alicloud/one-console-utils'; // FECS 支持跨域的 CORS 请求 var CORS_BASE_URL = 'https://fecs.console.aliyun.com'; // 默认请求路径 var BASE_URL = '/'; // One-console 各类接口 url 映射表 var API_URL = { open: ['data/api.json', 'data/multiApi.json'], inner: ['data/innerApi.json', 'data/multiInnerApi.json'], app: ['data/call.json', 'data/multiCall.json'] }; /** * Axios intercetor * One-console request pre-processor * @param {*} config */ function consoleRequestInterceptor(config) { // 如果传入了 url,且不在我们检查的 url 范围内,提前返回不作处理 if (!isValidURL(config.url, config.apiType)) { return config; } // 单或多接口调用 var multi = isMulti(config.data); // 检查参数格式是否正确 checkArguments(config.data, multi); var nextData; // 补全缺省必填参数并修正参数格式 nextData = fillExtraParams(config.data, config.useCors); // params 与 actions 需要 JSON.stringify nextData = formatData(nextData); // 返回新的 config 对象 return _objectSpread({}, config, { method: 'post', // 请求方法强制置为 'post' url: getURL(config.apiType, multi, config.description), // 获取请求 URL baseURL: config.useCors ? CORS_BASE_URL : BASE_URL, withCredentials: config.useCors ? true : false, data: nextData, requestStartTime: Date.now() }); } // 检查是否是合法的 url function isValidURL(url) { var apiType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'open'; var urls = API_URL[apiType]; if (url && !urls.includes(url)) { return false; } return true; } // 解析请求的 api 类型 function isMulti(data) { // 如果参数中存在 actions 则判定为 multi 请求 if (typeof data.actions !== 'undefined') { return true; } return false; } function getURL() { var apiType = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'open'; var multi = arguments.length > 1 ? arguments[1] : undefined; var description = arguments.length > 2 ? arguments[2] : undefined; var urls = API_URL[apiType]; // 添加一个 url 参数方便调试 if (description) { return "".concat(multi ? urls[1] : urls[0], "?__action=").concat(description); } return "".concat(multi ? urls[1] : urls[0]); } // 获取 region 用于后端区分调用的 endpoint function getRegion(data) { var multi = isMulti(data); if (!multi) { var _data$params = data.params; _data$params = _data$params === void 0 ? {} : _data$params; var RegionId = _data$params.RegionId; if (RegionId) { return RegionId; } } else { var actions = data.actions; var _iterator = _createForOfIteratorHelper(actions), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var action = _step.value; var _action$params = action.params; _action$params = _action$params === void 0 ? {} : _action$params; var _RegionId = _action$params.RegionId; if (_RegionId) { return _RegionId; } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } } return getCurrentRegionId(); } // 必填缺省参数补全并格式化部分参数 function fillExtraParams(data, useCors) { return _objectSpread({}, data, { sec_token: useCors ? getFecsToken() : getSecToken(), umid: useCors ? getFecsUmid() : getUmid(), collina: getCollina(), region: getRegion(data) }); } function formatData(data) { var nextData = _objectSpread({}, data); // stringify `params`,`content` 与 `actions` if (nextData.params) { nextData.params = JSON.stringify(nextData.params); } if (nextData.content) { nextData.content = JSON.stringify(nextData.content); } if (nextData.actions) { nextData.actions = JSON.stringify(nextData.actions); } return nextData; } // 检查参数 function checkArguments(data, multi) { if (multi) { checkArgumentsForMultiApi(data); } else { checkArgumentsForApi(data); } } // 检查单接口入参 function checkArgumentsForApi(_ref) { var product = _ref.product, action = _ref.action; if (!product) { throw new Error("You must specify which product's api you want to call"); } if (!action) { throw new Error('You must specify which api you want to call'); } } // 检查多接口入参 function checkArgumentsForMultiApi(_ref2) { var product = _ref2.product, actions = _ref2.actions; if (!product) { throw new Error("You must specify which product's api you want to call"); } if (!Array.isArray(actions)) { throw new TypeError('Actions must be an array'); } // loop through to check every action actions.forEach(function (_ref3) { var action = _ref3.action; if (!action) { throw new Error("You must specify which api you want to call.\n If you see this log, it's likely that you've forgot to specify an action\n property in your actions argument. Go for a double check."); } }); } export default consoleRequestInterceptor;