当前位置: 首页 > news >正文

关于uniapp解析SSE响应数据的处理

通过uniapp开发与大模型对话的微信小程序,并且后端需要通过SSE向小程序返回响应数据。

微信小程序端需要展示响应数据,在这个过程中,数据解析这里踩了不少坑。

uniapp端开发微信小程序时,SSE连接处理的代码如下:

  const initSSE2 = () => {console.log(uni.getStorageSync('token'))requestTask = uni.request({url: 'http://127.0.0.1:8889/connect',timeout: 30000,responseType: 'text',method: 'POST',enableChunked: true, //配置这里header: {Accept: 'text/event-stream','Authorization': uni.getStorageSync('token') //自定义请求头信息},responseType: 'arraybuffer',data: {},success: response => {console.log("success:" + JSON.stringify(response))},fail: error => {console.log("error:" + JSON.stringify(error))}})requestTask.onHeadersReceived((res) => {console.log("header:" + JSON.stringify(res.header));});// 这里监听消息requestTask.onChunkReceived((res) => {const uint8Array = new Uint8Array(res.data);let text = String.fromCharCode.apply(null, uint8Array);text = decodeURIComponent(escape(text));// 将后台通过streaming response返回的消息拼接到消息中messages.value[messages.value.length - 1].content += text;})}

后端返回的数据,在小程序端展示后结果如下: 

从展示效果看,返回的数据都以“data:”开头,而且数据都发生了换行。经过查询资料,了解到SSE返回的数据以"data:"开头,"\n\n"进行结尾,比如上面返回的数据类似这样的格式:

data:你好\n\n

SSE客户端端打印返回的数据:

        requestTask.onChunkReceived((res) => {console.log('响应数据:', res.data)const uint8Array = new Uint8Array(res.data);let text = String.fromCharCode.apply(null, uint8Array);text = decodeURIComponent(escape(text));// 将后台通过streaming response返回的消息拼接到消息中messages.value[messages.value.length - 1].content += text;})

 打印内容如下:

其中,"100 97 116 97 58"表示"data:","10 10"表示"\n\n",而且根据响应数据,我们发现SSE客户端是一次处理一批后端响应的数据。 

于是修改客户端解析数据的逻辑为:

requestTask.onChunkReceived((res) => {console.log('响应数据:', res.data)const uint8Array = new Uint8Array(res.data);let text = String.fromCharCode.apply(null, uint8Array);text = decodeURIComponent(escape(text));console.log('处理前:', text);let info = text.replace(/data:|\n\n/g, '')console.log('处理后:', info)// 将后台通过streaming response返回的消息拼接到消息中messages.value[messages.value.length - 1].content += info;})

其中通过正则表达式替换所有的"data:"和"\n\n"。替换后,展示效果如下:

但是根据后端打印的信息,在"回答:"后面是有换行的,后端输出内容:

这是由于后端返回大模型响应的数据时,需要换行的数据中间也使用了"\n\n",这就和SSE的数据格式产生了冲突。于是我们修改后端返回数据的代码,将"\n\n"替换为"\n":

前后端处理完成后,最终格式如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/256720.html

相关文章:

  • 如何用AI开发完整的小程序<7>—让AI微调UI排版
  • jxWebUI--系统说明
  • 企业级安全实践:SSL 加密与权限管理(二)
  • 云原生/容器相关概念记录
  • 第16章 接口 笔记
  • TCP流量控制与拥塞控制:核心机制与区别
  • Java 21 的虚拟线程与桥接模式:构建高性能并发系统
  • 【Dicom标准】dicom数据中pixelData显示处理流程详细介绍
  • Flink作业三种部署模式:架构、配置与实战应用
  • 由浅入深详解前缀树-Trie树
  • OC—多界面传值
  • Python 深度学习基础:TensorFlow 入门——从张量到神经网络的实战指南
  • Python 爬虫简单示例
  • 关于存储与网络基础的详细讲解(从属GESP二级内容)
  • React 核心原理与Fiber架构
  • [XILINX]ZYNQ7010_7020_软件LVDS设计
  • Spring Boot 项目初始化
  • HCIP-Datacom Core Technology V1.0_4 OSPF路由计算
  • 抽象工厂设计模式
  • 从C++编程入手设计模式——责任链模式
  • 大模型应用:如何使用Langchain+Qwen部署一套Rag检索系统
  • 【机器学习四大核心任务类型详解】分类、回归、聚类、降维都是什么?
  • OpenGL ES 中的材质
  • 分布式ID生成方式及优缺点详解
  • [特殊字符] AIGC工具深度实战:GPT与通义灵码如何彻底重构企业开发流程
  • 电脑商城--购物车
  • Camera Sensor接口协议全解析(三):移动霸主——MIPI CSI-2架构拆解
  • 【数据结构】_二叉树部分特征统计
  • rom定制系列------红米note11 5G版 MTK芯片强解bl锁修复bug 官方系统 面具root批量线刷版
  • React 新钩子useImperativeHandle