自己写的真是案例,onChunkReceived监听到的数据块发现监听到的内容不只是一个块,有时候会是多块,所以自己加了一个循环解析的过程,不知道大家监听到的数据情况是否一致。
在网上翻阅大量资料有的说引入js文件,亲测无效在控制台上始终报错。
onChunkReceived监听到的数据块格式是arraybuffer解析成json代码如下:
let requestTask = wx.request({
url: '/messagecs', //自己的路径
responseType: "arraybuffer",
enableChunked: true, //关键!开启流式传输模式
type: 'get', //HTTP请求类型
data: {
question: question
},
success: (res) => {
console.log("结束----request success", res);
},
fail: (err) => {
console.log("request fail", err);
}
});
requestTask.onChunkReceived((response) => {
console.log("监听数据块----request onChunkReceived", response);
// 收到流式数据,根据返回值进行相对应数据解码
let data64 = wx.arrayBufferToBase64(response.data);
let data64Txt = this.base64Decode(data64);
console.log('data64Txt:', data64Txt);
const messages = data64Txt.trim().split('\n\n');
const parsedMessages = messages.map(message => {
// 按 "data:" 拆分,取后面的部分
const dataPart = message.split('data:')[1];
if (dataPart) {
// 解析 JSON 字符串并返回对象
return JSON.parse(dataPart.trim());
}
}).filter(Boolean); // 过滤掉异常值
console.log('contentTxt:', contentTxt);
});
// Base64 解码函数(兼容小程序环境)
base64Decode(base64Str) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
let output = '';
// 去除可能的 Base64 前缀(如 data:text/plain;base64,)
base64Str = base64Str.replace(/^.*?base64,/, '');
// 遍历 Base64 字符串并解码
for (let i = 0; i < base64Str.length; i += 4) {
const a = chars.indexOf(base64Str.charAt(i));
const b = chars.indexOf(base64Str.charAt(i + 1));
const c = chars.indexOf(base64Str.charAt(i + 2));
const d = chars.indexOf(base64Str.charAt(i + 3));
// 将 4 个 Base64 字符转换为 3 个字节
const code = (a << 18) | (b << 12) | ((c & 63) << 6) | (d & 63);
output += String.fromCharCode((code >> 16) & 255);
if (c !== 64) output += String.fromCharCode((code >> 8) & 255);
if (d !== 64) output += String.fromCharCode(code & 255);
}
// 处理 Unicode 字符(如中文)
try {
return decodeURIComponent(escape(output));
} catch (e) {
return output;
}
}
代码说明:
1、首先通过代码wx.arrayBufferToBase64(response.data),把arrayBuffer数据解析成base64位的字符串;
2、this.base64Decode(data64),通过封装好的方法把base64位的字符串解析成json文本;
3、data64Txt.trim().split('\n\n'),用“\n\n”转换成json数组;