feat(http): 添加HTTP请求全链路日志打印

新增请求ID、耗时统计,打印请求参数、响应结果与失败信息,同时添加重试相关日志,完善各个接口的调用日志输出
This commit is contained in:
2026-07-30 10:40:07 +08:00
parent f6cc866aa7
commit 3bbf8c9531

View File

@@ -44,6 +44,15 @@ function _sleep(ms) {
} }
function _makeRequest(url, method, data, header, dataType, responseType, timeout) { function _makeRequest(url, method, data, header, dataType, responseType, timeout) {
const reqId = 'req_' + Date.now() + '_' + Math.floor(Math.random() * 10000);
const reqStart = Date.now();
console.log('[HTTP][REQUEST]', reqId, method, url, JSON.stringify({
data: data,
header: header,
dataType: dataType,
responseType: responseType,
timeout: timeout
}));
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
uni.request({ uni.request({
url: url, url: url,
@@ -54,6 +63,7 @@ function _makeRequest(url, method, data, header, dataType, responseType, timeout
responseType: responseType, responseType: responseType,
timeout: timeout, timeout: timeout,
success: (res) => { success: (res) => {
console.log('[HTTP][RESPONSE]', reqId, method, url, 'statusCode=', res.statusCode, 'cost=', (Date.now() - reqStart) + 'ms', JSON.stringify(res.data));
if (res.statusCode && [200, 500].indexOf(res.statusCode) == -1) { if (res.statusCode && [200, 500].indexOf(res.statusCode) == -1) {
reject({ errMsg: `request:fail statusCode=${res.statusCode}`, statusCode: res.statusCode }); reject({ errMsg: `request:fail statusCode=${res.statusCode}`, statusCode: res.statusCode });
return; return;
@@ -73,6 +83,7 @@ function _makeRequest(url, method, data, header, dataType, responseType, timeout
resolve(res.data); resolve(res.data);
}, },
fail: (res) => { fail: (res) => {
console.error('[HTTP][FAIL]', reqId, method, url, 'cost=', (Date.now() - reqStart) + 'ms', JSON.stringify(res));
reject(res); reject(res);
} }
}); });
@@ -87,15 +98,20 @@ async function _requestWithRetry(params, url, method, data, header, dataType, re
for (let attempt = 0; attempt <= maxRetries; attempt++) { for (let attempt = 0; attempt <= maxRetries; attempt++) {
try { try {
if (attempt > 0) {
console.log('[HTTP][RETRY]', method, url, 'attempt=', attempt, 'maxRetries=', maxRetries);
}
const result = await _makeRequest(url, method, data, header, dataType, responseType, timeout); const result = await _makeRequest(url, method, data, header, dataType, responseType, timeout);
return result; return result;
} catch (err) { } catch (err) {
lastError = err; lastError = err;
lastStatusCode = err && err.statusCode; lastStatusCode = err && err.statusCode;
console.warn('[HTTP][RETRY-FAIL]', method, url, 'attempt=', attempt, 'errMsg=', err && err.errMsg, 'statusCode=', lastStatusCode);
if (attempt >= maxRetries || !_shouldRetry(err.errMsg)) { if (attempt >= maxRetries || !_shouldRetry(err.errMsg)) {
break; break;
} }
const delay = RETRY_DELAY_BASE * Math.pow(2, attempt); const delay = RETRY_DELAY_BASE * Math.pow(2, attempt);
console.log('[HTTP][RETRY-WAIT]', method, url, 'delay=', delay + 'ms');
await _sleep(delay); await _sleep(delay);
} }
} }
@@ -207,6 +223,7 @@ export default {
} }
}, },
uploadBase64(params) { uploadBase64(params) {
console.log('[HTTP][REQUEST] uploadBase64', Config.baseUrl + '/api/upload/headimgBase64');
uni.request({ uni.request({
url: Config.baseUrl + '/api/upload/headimgBase64', url: Config.baseUrl + '/api/upload/headimgBase64',
method: 'POST', method: 'POST',
@@ -221,14 +238,17 @@ export default {
dataType: 'json', dataType: 'json',
responseType: 'text', responseType: 'text',
success: res => { success: res => {
console.log('[HTTP][RESPONSE] uploadBase64', 'statusCode=', res.statusCode, JSON.stringify(res.data));
typeof params.success == 'function' && params.success(res.data); typeof params.success == 'function' && params.success(res.data);
}, },
fail: () => { fail: () => {
console.error('[HTTP][FAIL] uploadBase64', JSON.stringify(res));
typeof params.fail == 'function' && params.fail(res); typeof params.fail == 'function' && params.fail(res);
} }
}); });
}, },
pullImage(params) { pullImage(params) {
console.log('[HTTP][REQUEST] pullImage', Config.baseUrl + '/api/upload/headimgPull', 'path=', params.path);
uni.request({ uni.request({
url: Config.baseUrl + '/api/upload/headimgPull', url: Config.baseUrl + '/api/upload/headimgPull',
method: 'POST', method: 'POST',
@@ -243,14 +263,17 @@ export default {
dataType: 'json', dataType: 'json',
responseType: 'text', responseType: 'text',
success: res => { success: res => {
console.log('[HTTP][RESPONSE] pullImage', 'statusCode=', res.statusCode, JSON.stringify(res.data));
typeof params.success == 'function' && params.success(res.data); typeof params.success == 'function' && params.success(res.data);
}, },
fail: () => { fail: () => {
console.error('[HTTP][FAIL] pullImage', JSON.stringify(res));
typeof params.fail == 'function' && params.fail(res); typeof params.fail == 'function' && params.fail(res);
} }
}); });
}, },
upload(params) { upload(params) {
console.log('[HTTP][REQUEST] upload', Config.baseUrl + params.url, 'name=', params.name || 'file');
uni.uploadFile({ uni.uploadFile({
url: Config.baseUrl + params.url, url: Config.baseUrl + params.url,
filePath: params.filePath, filePath: params.filePath,
@@ -264,9 +287,11 @@ export default {
'content-type': 'application/x-www-form-urlencoded;application/json' 'content-type': 'application/x-www-form-urlencoded;application/json'
}, },
success: (res) => { success: (res) => {
console.log('[HTTP][RESPONSE] upload', Config.baseUrl + params.url, 'statusCode=', res.statusCode, res.data);
typeof params.success == 'function' && params.success(JSON.parse(res.data)); typeof params.success == 'function' && params.success(JSON.parse(res.data));
}, },
fail: (res) => { fail: (res) => {
console.error('[HTTP][FAIL] upload', Config.baseUrl + params.url, JSON.stringify(res));
typeof params.fail == 'function' && params.fail(res); typeof params.fail == 'function' && params.fail(res);
} }
}); });