(function (root, factory) { // 请求工具封装 URL、Header 和响应解包,业务路径由 api-client 统一提供。 if (typeof module === 'object' && module.exports) { module.exports = factory(root); return; } root.RequestUtil = factory(root); })(typeof globalThis !== 'undefined' ? globalThis : window, function (root) { 'use strict'; function trimSlashes(value) { return String(value || '').replace(/^\/+|\/+$/g, ''); } function joinUrl(baseUrl, path) { var base = String(baseUrl || '').replace(/\/+$/g, ''); var cleanPath = '/' + trimSlashes(path); return base + cleanPath; } function appendQuery(url, query) { if (!query) return url; var params = new URLSearchParams(); Object.keys(query).forEach(function (key) { var value = query[key]; if (value === undefined || value === null || value === '') return; params.append(key, value); }); var queryText = params.toString(); return queryText ? url + '?' + queryText : url; } function isFormData(body) { return typeof FormData !== 'undefined' && body instanceof FormData; } function createHttpError(message, detail) { var error = new Error(message); Object.keys(detail || {}).forEach(function (key) { error[key] = detail[key]; }); return error; } async function parseJson(response) { try { return await response.json(); } catch (error) { return null; } } function unwrapResponse(payload) { if (!payload || typeof payload !== 'object') return payload; if (payload.code !== undefined && payload.code !== 200) { throw createHttpError(payload.msg || '接口请求失败', { code: payload.code, response: payload }); } if (Object.prototype.hasOwnProperty.call(payload, 'data')) return payload.data; if (Object.prototype.hasOwnProperty.call(payload, 'rows')) { return { rows: payload.rows, total: payload.total }; } return payload; } function createRequester(options) { var settings = options || {}; var fetchImpl = settings.fetchImpl || root.fetch; return async function request(method, path, requestOptions) { var req = requestOptions || {}; var headers = Object.assign({}, req.headers || {}); var token = settings.getToken ? settings.getToken() : ''; var tokenHeaderName = settings.tokenHeaderName || 'Authorization'; var url = appendQuery(joinUrl(settings.baseUrl, path), req.query); var body = req.body; headers.clientid = settings.clientId; if (token && req.auth !== false) headers[tokenHeaderName] = 'Bearer ' + token; if (body !== undefined && body !== null && !isFormData(body)) { headers['Content-Type'] = headers['Content-Type'] || 'application/json'; body = JSON.stringify(body); } var response = await fetchImpl(url, { method: method, headers: headers, body: body }); var payload = await parseJson(response); if (!response.ok) { throw createHttpError((payload && payload.msg) || '接口请求失败', { status: response.status, response: payload }); } return unwrapResponse(payload); }; } return { createRequester: createRequester, joinUrl: joinUrl, appendQuery: appendQuery }; });