UNPKG

axios-wechat-adapter

Version:

axios微信小程序适配器,可以复用web或者node上的axios请求

126 lines (125 loc) 4.38 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; export const isDate = (val) => { return toString.call(val) === '[object Date]'; }; export const isJSONstr = (str) => { try { return (typeof str === 'string' && str.length && (str = JSON.parse(str)) && Object.prototype.toString.call(str) === '[object Object]'); } catch (error) { return false; } }; export const encode = (val) => { return encodeURIComponent(val) .replace(/%40/gi, '@') .replace(/%3A/gi, ':') .replace(/%24/g, '$') .replace(/%2C/gi, ',') .replace(/%20/g, '+') .replace(/%5B/gi, '[') .replace(/%5D/gi, ']'); }; /** 方法转换器 */ export const methodProcessor = (axiosMethod) => { const upperCaseMethod = axiosMethod.toUpperCase(); const repeatMethod = ['GET', 'PUT', 'DELETE', 'OPTIONS', 'POST']; if (repeatMethod.includes(upperCaseMethod)) { return upperCaseMethod; } else { throw new Error(`微信小程序暂不支持${axiosMethod}方法`); } }; /** url路径转换器 */ export const urlProcessor = (baseURL, path, params, paramsSerializer) => { let fullPath = /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(path) ? path : `${baseURL || ''}${path || ''}`; if (!params) { return fullPath; } const connector = fullPath.includes('?') ? '&' : '?'; let serializedParam; if (paramsSerializer) { serializedParam = paramsSerializer(params); return `${fullPath}${connector}${serializedParam}`; } if (typeof params === 'string') { serializedParam = params; } if (typeof params === 'object') { serializedParam = Object.keys(params) .reduce((prev, key) => { const value = params[key]; if (value === null || value === '') { return prev; } if (Array.isArray(value)) { value.forEach((item) => { prev.push(`${encode(key + '[]')}=${encode(item)}`); }); return prev; } if (isDate(value)) { prev.push(`${encode(key)}=${encode(value.toISOString())}`); return prev; } if (typeof value === 'object') { prev.push(`${encode(key)}=${encode(value.toString())}`); return prev; } prev.push(`${encode(key)}=${encode(value)}`); return prev; }, []) .join('&'); } return `${fullPath}${serializedParam ? connector : ''}${serializedParam}`; }; export const dataProcessor = (data) => { if (isJSONstr(data)) { return JSON.parse(data); } return data; }; /** 正确返回处理器 * 默认情况下 4xx、5xx请求在微信小程序中属于成功的返回 * 因此这里需要对successResult做一次判断过滤 * */ export const successResProcessor = (resolve, reject, res, config, request) => { const { data, statusCode, errMsg, header } = res, restResult = __rest(res, ["data", "statusCode", "errMsg", "header"]); const response = Object.assign({ data: data, status: statusCode, statusText: errMsg, headers: header, config: config, request }, restResult); //保持和web逻辑一致 if (config.validateStatus && !config.validateStatus(statusCode)) { const error = new Error(`Request failed with status code ${statusCode}`); error.config = config; error.request = request; error.response = response; error.isAxiosError = true; reject(error); return; } resolve(response); }; /** 错误返回处理器 */ export const failResProcessor = (reject, res, config, request) => { const error = new Error(res.errMsg); error.config = config; error.request = request; error.isAxiosError = true; reject(error); };