(function () { 'use strict'; var DEFAULT_ERROR_MESSAGE = 'Request failed'; function getErrorMessage(result) { if (result && (typeof result.message === 'string' || typeof result.message === 'number')) { return String(result.message); } if (result && (typeof result.msg === 'string' || typeof result.msg === 'number')) { return String(result.msg); } return DEFAULT_ERROR_MESSAGE; } function isSuccessCode(code) { return code === 0 || code === 200 || code === '0' || code === '200'; } function parseResponse(response) { return response.json().catch(function () { return { code: -1, message: DEFAULT_ERROR_MESSAGE }; }); } /** * 通用 API 请求封装,统一错误处理 * @param {string} url 请求地址 * @param {Object} [options] fetch 选项 * @returns {Promise} 成功时返回 data / result / 响应体 */ function request(url, options) { var fetchOptions = Object.assign({ credentials: 'include' }, options || {}); return fetch(url, fetchOptions) .then(function (response) { return parseResponse(response).then(function (result) { var code = result && result.code; if (!response.ok || !isSuccessCode(code)) { var err = new Error(getErrorMessage(result)); err.code = code != null ? code : (response.status || -1); err.status = response.status; err.data = result; throw err; } return result && (result.data !== undefined ? result.data : result.result !== undefined ? result.result : result); }); }) .catch(function (err) { if (err && err.message) { throw err; } var fallback = new Error(DEFAULT_ERROR_MESSAGE); fallback.code = -1; throw fallback; }); } /** * 带鉴权头的请求,自动注入当前 token * @param {string} url 请求地址 * @param {Object} [options] fetch 选项 * @param {string} [token] 可选 token,默认使用 window.WELFARE_TOKEN * @returns {Promise} */ function requestWithAuth(url, options, token) { var authToken = token != null ? token : (window.WELFARE_TOKEN || ''); var headers = Object.assign({}, options && options.headers); if (authToken) { headers.Authorization = authToken; } return request(url, Object.assign({}, options, { headers: headers })); } window.BEXApi = { request: request, requestWithAuth: requestWithAuth, isSuccessCode: isSuccessCode, getErrorMessage: getErrorMessage }; })();