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:
杨明明 2025-09-03 20:14:59 +08:00
parent 24098c4c7a
commit 3c17fb7015
1 changed files with 62 additions and 6 deletions

View File

@ -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}`);
}
}