小程序分块传输

81 阅读1分钟

2024-07-16 创建于墨问

协议参考 Web SSE

详细文档不好找,在 21 年的一个公告里:

补充:

  1. 服务端传输前中文需要编码为 base64,否则可能接收异常 详情

  2. 全部数据接收完成后,会触发 requset success

  3. 可以执行 requestTask.abort() 主动断开,会触发 requset fail

  4. timeout 超时时间没有生效,实际超时了会一直等待,需要小程序去主动断开链接

  5. 能够自动重连,但超过 5 秒后,大概率会一直等待,需要小程序去主动断开链接

接收到的数据,转换流程为:

  1. ArrayBuffer 转换为 String

  2. 使用 \n 拆分 String

  3. 将 String 中的 base64 字符串,转换为普通字符串

  4. 使用 JSON.parse 把普通字符串,转换为 Object

对比了下 stackoverflow 里几种方式,最终使用 JS 来实现 arrayBufferToString:

base64 转 String:

const arrayBuffer =

wx.base64ToArrayBuffer(base64)

const jsonText =

arrayBufferToString(arrayBuffer)

最后遇到了 3 个 bug,需要自行 hack 解决下:

#271 [mac] wx.request 分块传输完成后,statusCode 返回 NaN,预期是 200

#272 [ios] wx.request 分块传输过程中,如果网络中断,没有执行任何回调事件,预期是执行 fail

#304 requestTask.onChunkReceived 分块传输,有概率一次事件收到 2 个包