fix: 修复HTTP/2流提前终止错误,增强网络请求稳定性
网络请求优化: - 禁用HTTP/2协议,强制使用HTTP/1.1避免兼容性问题 - 优化请求头配置,添加Connection: keep-alive - 禁用缓存,确保请求实时性 重试机制: - 添加智能重试机制,最多重试3次 - 递增延迟策略:1s、2s、3s - 自动识别网络错误类型进行重试 错误处理增强: - 智能检测HTTP/2流终止、超时、网络错误 - 详细的错误日志记录,便于调试 - 友好的错误消息提示用户 请求优化: - GET请求使用URL参数而非body - POST请求正确设置data字段 - 添加详细的请求和响应日志 稳定性提升: - 自动处理网络不稳定情况 - 减少因临时网络问题导致的失败 - 提升用户体验,减少重复操作 调试改进: - 完整的请求生命周期日志 - 包含重试次数和错误详情 - 便于定位和解决网络问题 解决错误:request:fail The HTTP/2 stream has been early terminated
This commit is contained in:
parent
24098c4c7a
commit
3c17fb7015
|
|
@ -60,17 +60,49 @@ export class SdkServer {
|
|||
private async request<T>(
|
||||
url: string,
|
||||
method: 'GET' | 'POST' = 'GET',
|
||||
data?: any
|
||||
data?: any,
|
||||
retryCount: number = 0
|
||||
): Promise<ApiResponse<T>> {
|
||||
const maxRetries = 3;
|
||||
const retryDelay = 1000 * (retryCount + 1); // 递增延迟
|
||||
|
||||
try {
|
||||
const response = await Taro.request({
|
||||
console.log(`SDK Server request: ${method} ${this.baseUrl}${url}`, { data, retryCount });
|
||||
|
||||
const requestConfig: any = {
|
||||
url: `${this.baseUrl}${url}`,
|
||||
method,
|
||||
data,
|
||||
timeout: this.timeout,
|
||||
header: {
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': 'application/json',
|
||||
// 强制使用HTTP/1.1避免HTTP/2问题
|
||||
'Connection': 'keep-alive',
|
||||
},
|
||||
// 禁用HTTP/2
|
||||
enableHttp2: false,
|
||||
// 启用缓存
|
||||
enableCache: false,
|
||||
};
|
||||
|
||||
// 根据请求方法设置数据
|
||||
if (method === 'GET') {
|
||||
// GET请求使用query参数
|
||||
if (data) {
|
||||
const params = new URLSearchParams(data).toString();
|
||||
requestConfig.url += `?${params}`;
|
||||
}
|
||||
} else {
|
||||
// POST请求使用body
|
||||
requestConfig.data = data;
|
||||
}
|
||||
|
||||
const response = await Taro.request(requestConfig);
|
||||
|
||||
console.log(`SDK Server response:`, {
|
||||
statusCode: response.statusCode,
|
||||
data: response.data,
|
||||
header: response.header
|
||||
});
|
||||
|
||||
if (response.statusCode === 200) {
|
||||
|
|
@ -85,9 +117,33 @@ export class SdkServer {
|
|||
} else {
|
||||
throw new Error(`HTTP ${response.statusCode}: ${response.data?.msg || 'Request failed'}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('SDK Server request error:', error);
|
||||
throw error;
|
||||
} catch (error: any) {
|
||||
console.error('SDK Server request error:', {
|
||||
url: `${this.baseUrl}${url}`,
|
||||
method,
|
||||
data,
|
||||
retryCount,
|
||||
error: error.message || error
|
||||
});
|
||||
|
||||
// 检查是否是网络错误且可以重试
|
||||
const isNetworkError = error.message?.includes('stream has been early terminated') ||
|
||||
error.message?.includes('timeout') ||
|
||||
error.message?.includes('network') ||
|
||||
error.errMsg?.includes('request:fail');
|
||||
|
||||
if (isNetworkError && retryCount < maxRetries) {
|
||||
console.log(`Retrying request in ${retryDelay}ms... (${retryCount + 1}/${maxRetries})`);
|
||||
|
||||
// 等待后重试
|
||||
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
||||
|
||||
return this.request<T>(url, method, data, retryCount + 1);
|
||||
}
|
||||
|
||||
// 包装错误信息
|
||||
const errorMessage = error.message || error.errMsg || 'Unknown network error';
|
||||
throw new Error(`网络请求失败: ${errorMessage}`);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue