import qs from 'qs' import { AjaxInstance, AnyObj, ProxyedAttrs } from './types' /** * 标准化config配置,或根据配置项设置相关的参数 * 该函数返回的配置对象,应该完全符合axios的配置规范 * @param {*} config */ export function normalizeConfig(ctx: AjaxInstance, config) { const { headers = {}, sendFormData = false, data = undefined, params = {}, baseUrl = '', baseURL = '', ...rest } = { ...ctx.$options, ...config }; // 数据格式为FormData,修改content-type头,以及修改data格式 const contentType = headers['content-type'] || headers['Content-Type'] || 'application/json'; headers['content-type'] = sendFormData ? 'application/x-www-form-urlencoded' : contentType; const sendData = sendFormData && typeof data === 'object' && data !== null ? qs.stringify(data) : data; // baseUrl,支持两种写法,且用户配置的baseUrl优先级最高 const bUrl = baseUrl || baseURL || ctx.$baseUrl; return { headers, params, data: sendData, baseURL: bUrl, ...rest, }; } export function addInstanceExtendMethod(ctx) { const extend = (source: AnyObj) => { Object.keys(source).forEach((key) => { ctx[key] = source[key]; }); }; ctx.extend = extend; } export function proxyAxiosMethods(target: AnyObj, source: S): void { const methods: ProxyedAttrs[] = ['request', 'interceptors']; // const methods: ProxyedAttrs[] = ['request', 'get', 'post', 'delete', 'head', 'options', 'put', 'patch', 'interceptors']; methods.forEach((method) => { Object.defineProperty(target, method, { value: source[method], writable: false, }); }); }