首页 前端知识 微信小程序请求大模型监听数据块onChunkReceived方法把数据解析成json

微信小程序请求大模型监听数据块onChunkReceived方法把数据解析成json

2025-02-28 12:02:23 前端知识 前端哥 468 455 我要收藏

        自己写的真是案例,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数组;

转载请注明出处或者链接地址:https://www.qianduange.cn//article/21940.html
标签
评论
会员中心 联系我 留言建议 回顶部
复制成功!