feat(http): 添加HTTP请求全链路日志打印
新增请求ID、耗时统计,打印请求参数、响应结果与失败信息,同时添加重试相关日志,完善各个接口的调用日志输出
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user