使用 UniApp 在微信小程序中实现 SSE 流式响应

news/2024/12/27 5:13:36/

在这里插入图片描述

概述

服务端发送事件(Server-Sent Events, SSE)是一种允许服务器向客户端推送实时更新的技术。SSE 提供了一种单向的通信通道,服务器可以持续地向客户端发送数据,而不需要客户端频繁发起请求。这对于需要实时更新的应用场景非常有用。

流式传输的特点是将数据逐步传输给客户端,而不需要等待完整的响应生成。这意味着在传输过程中,数据会逐步发送给客户端,而不是一次性发送所有数据,对于基于文本的AI对话来说,这意味着每个单词或短语可以随着模型预测它们时即时显示出来,从而营造出一种更加自然和动态的交流体验。

最近在对接大模型对话生成接口,查找官方文档中并没有找到明确的实现说明,本文根据 Uniapp 及小程序>微信小程序开发文档,基于 uni.request 实现了一个简单的SSE客户端。

准备

服务端已提供SSE接口,可通过 Apifox 直接访问进行测试。

Uniapp 客户端实现

要实现在小程序>微信小程序中接收 SSE 流式响应,我们需要做几个关键步骤:

  1. 配置 HTTP 请求:设置适当的请求头和参数,以确保服务器知道我们期望的是流式响应。
  2. 处理分块数据:由于 SSE 是分块传输的,我们需要监听每个数据块,并适当地解析它们。
  3. 错误和完成处理:定义当遇到错误或完成时的行为。

下面是一个使用 uni.request API 实现 SSE 的例子:


let buffer = ''
function decode(data: ArrayBuffer): string {// 根据协议对数据进行解析,省略...// 注意数据可能是不连续的,需要通过 buffer 进行拼接
}function streamPost(url, data, onData, onError = null, onComplete = null) {function onChunkReceived(res) {onData(decode(res.data))}function onHeadersReceived(res) {console.log('onHeadersReceived', res)}const requestTask = uni.request({url: baseUrl + apiPath + url,method: 'POST',header: {Accept: 'text/event-stream', // 确保服务器知道我们期望的是流式响应Authorization: uni.getStorageSync('token'),// ...其他参数},data,enableChunked: true, // onChunkReceived, 否则走success()responseType: 'arraybuffer',success: (res) => {console.log('Data received:', res.data) // 开启 enableChunked 时仅最后一次会走这个},fail: (error) => { // 错误处理if (onError) {onError(error)}console.error('SSE failed:', error)},complete: () => { // 完成接收if (onComplete) {onComplete()}if (onHeadersReceived) {requestTask?.offHeadersReceived(onHeadersReceived)}if (onChunkReceived) {// @ts-expect-error uni-app types lostrequestTask?.offChunkReceived(onChunkReceived)}},})if (onHeadersReceived) {requestTask.onHeadersReceived(onHeadersReceived)}if (onChunkReceived) {// @ts-expect-error uni-app types lostrequestTask.onChunkReceived(onChunkReceived) // 注册数据接收响应函数}return requestTask // 外部可通过 requestTask.abort(); 主动结束
}

在 nginx 中开启transfer_encoding, 同时关闭缓存 proxy_buffering。

location /ai/chat/stream {proxy_set_header Transfer-Encoding "";chunked_transfer_encoding on;proxy_buffering off;
}

总结

  • 开启:enableChunked: true
  • 设置请求 Header:Accept: 'text/event-stream'
  • 注册数据接收响应函数: requestTask.onChunkReceived(onChunkReceived)
  • 主动结束: requestTask.abort()
  • 分块数据解析:decode()

通过以上步骤,我们成功地在 UniApp 中实现了 SSE 流式响应,增强了应用程序的实时交互能力。希望这篇文章能为你在 UniApp 中集成实时数据更新功能提供有价值的参考。

参考

  • uniapp api 文档: https://uniapp.dcloud.net.cn/api/request/request.html
  • 小程序开发文档:wx.request https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.onChunkReceived.html

欢迎合作

最近业余在做的个人项目:https://www.aaronzzh.cn

如果这篇文章对您有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢您的细心阅读,如果发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理 _


http://www.ppmy.cn/news/1557917.html

相关文章

Xilinx 平台 drp 动态调节 mmcm

分享个人觉得有意思的知识: 什么样的时钟 会输入到 锁相环里 锁相环框图 VCO 控制电压控制频率 DS182 可以查看 VCO 范围 a. 先生成高频 的 VCO b. 再通过 倍频和分频 产生具体各路时钟 c. 怎么控制 输出频率?XAPP888 a. high time 是VCO 高电平 持续…

Flutter:生成二维码

qr_flutterAPI # 二维码 qr_flutter: ^4.1.0// 主视图 import package:qr_flutter/qr_flutter.dart;Widget _buildView() {return <Widget>[QrImageView(data: 10086,version: QrVersions.auto,size: 400.w,gapless: false,embeddedImage: const AssetImage(assets/img/…

【图像处理lec8】彩色图像处理

目录 一、MATLAB中的彩色图像表示&#xff08;3-9页&#xff09; 1、光谱与光的性质 2、颜色感知与色彩模型 3、色度学与色彩空间 4、MATLAB 图像表示 5、索引图像与调色板 6、颜色近似与转换 二、颜色空间转换&#xff08;10-17页&#xff09; 1、颜色空间的分类与作…

Spring Security 6.3 权限异常处理实战解析

一、问题描述 在开发员工管理系统&#xff08;EMS&#xff09;时&#xff0c;遇到一个权限异常处理的问题&#xff1a; 2024-12-24T20:33:42.89108:00 ERROR 17144 --- [ems] [nio-8080-exec-2] com.ems.handler.GlobalExceptionHandler : 全局异常信息&#xff1a;Access …

Spark-Streaming receiver模式源码解析

一、上下文 《Spark-Streaming初识》博客中我们用NetworkWordCount例子大致了解了Spark-Streaming receiver模式的运行。下面我们就通过该代码进行源码分析&#xff0c;深入了解其原理。 二、构建StreamingContext 它是Spark Streaming功能的主要入口点。并提供了从各种输入…

12.19问答解析

概述 某中小型企业有四个部门&#xff0c;分别是市场部、行政部、研发部和工程部&#xff0c;请合理规划IP地址和VLAN&#xff0c;实现企业内部能够互联互通&#xff0c;同时要求市场部、行政部和工程部能够访问外网环境(要求使用OSPF协议)&#xff0c;研发部不能访问外网环境…

微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 MinIO 文件服务器概述 1.1 MinIO 使用 Docker 部署 1.2 MinIO 控制台的使用 2.0 使用 Java 操作 MinIO 3.0 使用 minioClient 对象的方法 3.1 判断桶是否存在 3.2…

将三个list往一个excel表的三个sheet中写入,能用多线程提高写入速度

1. 多线程大批量写入可能导致 OOM 多线程可以加速写入操作&#xff0c;因为每个线程可以独立处理一个 Sheet。 但多线程会导致内存占用增加&#xff0c;因为多个线程可能同时将数据加载到内存中。 如果每个 List 数据量过大&#xff0c;而 JVM 的堆内存不够&#xff0c;就会触…