Files
jiapu/utils/RequestUtil.js
T
2026-07-09 17:30:10 +08:00

121 lines
3.3 KiB
JavaScript

(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
};
});