From 3c17fb7015971dad77a99f2f59ba828232c4053a Mon Sep 17 00:00:00 2001 From: imeepos Date: Wed, 3 Sep 2025 20:14:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DHTTP/2=E6=B5=81?= =?UTF-8?q?=E6=8F=90=E5=89=8D=E7=BB=88=E6=AD=A2=E9=94=99=E8=AF=AF=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E7=BD=91=E7=BB=9C=E8=AF=B7=E6=B1=82=E7=A8=B3?= =?UTF-8?q?=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 网络请求优化: - 禁用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 --- src/sdk/sdk-server.ts | 68 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/src/sdk/sdk-server.ts b/src/sdk/sdk-server.ts index d39b5a9..0577b61 100644 --- a/src/sdk/sdk-server.ts +++ b/src/sdk/sdk-server.ts @@ -60,17 +60,49 @@ export class SdkServer { private async request( url: string, method: 'GET' | 'POST' = 'GET', - data?: any + data?: any, + retryCount: number = 0 ): Promise> { + 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(url, method, data, retryCount + 1); + } + + // 包装错误信息 + const errorMessage = error.message || error.errMsg || 'Unknown network error'; + throw new Error(`网络请求失败: ${errorMessage}`); } }