[微信小程序]对接sse接口
[微信小程序]对接sse接口
在uni开发中,在微信小程序中实现sse接口请求
- 相关连接
微信小程序对接SSE接口记录
uni中实现sse代码
-
注意的坑点
- 接收的并不是字符串,而是
ArrayBuffer - 模拟流推送并不是流推送,会有
data:字符扰乱 - 推送并不是完全按照一条条推送,如果过快,可能一次收到多条,如果信息过大,可能收到半条,同理,收到的可能是第一条的后半部分,两条正常数据,第四条的前半部分
- 接收的并不是字符串,而是
-
格式解决方式
ArrayBuffer转String
-
推送错乱
- 解析前,判断是否有未解析的部分,拼接后再解析
- 解析后,最后无法解析的部分,保留下来到下次推送再解析
import { BASE_URL } from '../config'// arrayBuffer 转 String
function arrayBufferToString(arr) {if (typeof arr === 'string') {return arr}var dataview = new DataView(arr)var ints = new Uint8Array(arr.byteLength)for (var i = 0; i < ints.length; i++) {ints[i] = dataview.getUint8(i)}var str = '',_arr = intsfor (var i = 0; i < _arr.length; i++) {if (_arr[i]) {var one = _arr[i].toString(2),v = one.match(/^1+?(?=0)/)if (v && one.length == 8) {var bytesLength = v[0].lengthvar store = _arr[i].toString(2).slice(7 - bytesLength)for (var st = 1; st < bytesLength; st++) {if (_arr[st + i]) {store += _arr[st + i].toString(2).slice(2)}}str += String.fromCharCode(parseInt(store, 2))i += bytesLength - 1} else {str += String.fromCharCode(_arr[i])}}}return str
}function parseSSEData(sseData) {// 使用正则表达式匹配每个data:开头的块,包括可能的多行内容const regex = /data:([\s\S]*?)(?=\n\s*data:|$)/gconst matches = [...sseData.matchAll(regex)]// 从匹配结果中提取JSON字符串const jsonStrings = matches.map(match => {// 获取匹配的内容并清理const jsonContent = match[0].trim().replace(/\n/g, '')return jsonContent})return jsonStrings
}// 解析`data:`开头的json字符串
const safeJsonParse = (str = '') => {const str1 = str.trim()if (str1.startsWith('data:')) {try {const data = JSON.parse(str1.slice(5))return data} catch (err) {throw new Error('[json解析失败]')}} else {throw new Error('[未匹配到消息头]')}
}/*** 遗留消息* 如果一条消息解析失败,则认为该消息为半条消息,和后续消息拼接后再进行解析*/
const LegacyMessage = new Map()// 微信小程序实现sse,通过wx自己的方式实现
export const SSE_WX = ({ url, data, success, error, finish }) => {let requestTask = nulltry {const uid = Math.random().toString(36).substring(2, 9)// 处理接收到的数据const listener = res => {// 1. 转换成字符串的格式const str1 = arrayBufferToString(res.data)console.log('------------------------------------------')console.log('接收消息:\n', str1)// 2. 判断是否存在未解析部分,如果存在,则解析合并后的字符串let prefix = ''if (LegacyMessage.has(uid)) {prefix = LegacyMessage.get(uid)}const str2 = `${prefix}${str1}`// 3. 进行解析const jsonStrings = parseSSEData(str2)if (!jsonStrings.length) {// 3.1. 如果解析为空 则代表该部分为片段部分LegacyMessage.set(uid, str2)} else {// 3.2. 解析内容不为空LegacyMessage.delete(uid)// 4.1. 判断解析后数组,是否是完整的数据,最后一项进行特殊处理for (let i = 0; i < jsonStrings.length - 1; i++) {const data = safeJsonParse(jsonStrings[i])success && success(data)}// 4.2. 最后一项特殊处理,判断正常解析,还是记录未处理的内容const last = jsonStrings[jsonStrings.length - 1]try {const data = safeJsonParse(last)success && success(data)} catch (err) {LegacyMessage.set(uid, last)}}}// 发起请求requestTask = wx.request({url: `${BASE_URL}${url}`,method: 'POST',enableChunked: true, // enableChunked必须为truedata: data,header: {'content-type': 'application/json'},// 执行完成complete(res) {// 移除监听 需传入与监听时同一个的函数对象requestTask.offChunkReceived(listener)// 触发完成回调if (finish && typeof finish === 'function') {finish(res)}}})// 监听服务端返回的数据requestTask.onChunkReceived(listener)return {abort: () => {// 移除监听 需传入与监听时同一个的函数对象requestTask.offChunkReceived(listener)requestTask.abort()}}} catch (err) {console.error('[sse请求异常]', err)error(err)requestTask?.abort()}
}
相关文章:
[微信小程序]对接sse接口
[微信小程序]对接sse接口 在uni开发中,在微信小程序中实现sse接口请求 相关连接 微信小程序对接SSE接口记录 uni中实现sse代码 注意的坑点 接收的并不是字符串,而是ArrayBuffer模拟流推送并不是流推送,会有data:字符扰乱推送并不是完全按照…...
01 相机标定与相机模型介绍
学完本文,您将了解不同相机模型分类、内参意义,及对应的应用代码模型 标定的意义 建模三维世界点投影到二维图像平面的过程。标定输出的是相机模型。 相机模型 相机模型可以解理解为投影模型 +...
【商城实战(72)】解锁用户评价与晒单功能开发秘籍
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
2025.03.27【基因分析新工具】| MAST:解锁基因表达差异分析与网络构建
文章目录 1. MAST工具简介:探索生物信息分析的新利器1.1 什么是MAST工具?1.2 MAST工具的优势1.3 MAST工具的应用场景 2. MAST的安装方法:轻松入门的第一步2.1 安装R语言环境2.2 安装MAST包2.3 安装依赖库 3. MAST常用命令:掌握数据…...
浅谈WebSocket-FLV
FLV是一种视频数据封装格式,这种封装被标准通信协议HTTP-FLV和RTMP协议应用。 而WebSocket-FLV是一种非标的FLV封装数据从后端发送到前端的一种方式。 在WebSocket的url请求中,包含了需要请求设备的视频相关信息,在视频数据到达时,…...
SICAR标准 汽车焊装生产线触摸屏操作说明
目录 SIMATIC HMI 是西门子工业自动化解决方案的核心组件,支持实时设备监控与交互,文档中展示了其在焊装生产线中以SICAR标准为基础的具体应用,包括车型切换(如 AY2/A26)、KMC 夹具配置及能源效率分析,适用…...
CentOS 7 磁盘及分区管理笔记
一、查看磁盘信息 1. lsblk 命令 作用:列出系统中所有的块设备(包括磁盘、分区等)及其相关信息,如设备名称、大小、类型等。 命令格式:lsblk 示例: lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sd…...
Unity Standard Shader 解析(一)之ForwardBase(标准版)
一、ForwardBase // Base forward pass (directional light, emission, lightmaps, ...)Pass{Name "FORWARD"Tags { "LightMode" "ForwardBase" }Blend [_SrcBlend] [_DstBlend]ZWrite [_ZWrite]CGPROGRAM#pragma target 3.0// --------------…...
关于bug总结记录
1、vs中出现bug error C1083:无法打开文件 链接:vs中出现bug error C1083:无法打开文件_vs20151083错误解决方法-CSDN博客 2、 VS小技巧:系统却提示:示msvcp120.dll丢失 链接:VS小技巧:系统却提示:示msvc…...
go - grpc入门
前期准备 工具安装及使用 grpc开发 编写proto文件 proto文件是符合Protocol Buffers语言规范的数据交换协议文件,就像以前WebService定义服务时使用的XML文件。现在一般都是用proto3了,这里创建一个名为 hello.proto 的文件,放到项目的pr…...
Selenium Web自动化如何快速又准确的定位元素路径,强调一遍是元素路径
如果文章对你有用,请给个赞! 匹配的ChromeDriver和浏览器版本是更好完成自动化的基础,可以从这里去下载驱动程序: 最全ChromeDriver下载含win linux mac 最新版本134.0.6998.165 持续更新..._chromedriver 134-CSDN博客 如果你问…...
鸿蒙-全屏播放页面(使用相对布局)---持续更新中
最终实现效果图: 实现步骤 创建FullScreenPlay.ets全品播放页面 并将其修改为启动页面。 全屏播放,屏幕必然横过来,所以要将窗口横过来。 编辑 src/main/ets/entryability/EntryAbility.ets 若写在/EntryAbility.ets中,则所有…...
全面讲解python的uiautomation包
在常规的模拟鼠标和键盘操作,我们一般使用pyautogui,uiautomation模块不仅能直接支持这些操作,还能通过控件定位方式直接定位到目标控件的位置,而不需要自己去获取对应坐标位置。uiautomation模块不仅支持任意坐标位置截图&#x…...
CentOS 7 源码安装libjsoncpp-1.9.5库
安装依赖工具 sudo yum install cmake make gcc cmake 需要升级至 3.8.0 以上可参考:CentOS安装CMakegcc 需要升级至9.0 以上可参考:CentOS 7升级gcc版本 下载源码 wget https://github.com/open-source-parsers/jsoncpp/archive/refs/tags/1.9.5.…...
备赛蓝桥杯之第十六届模拟赛第1期职业院校组第五题:回忆画廊
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
闭包、装饰器学习笔记(第二次学习)
以下是整理后的笔记格式: --- # 闭包与装饰器 ## 一、闭包的概念,作用,条件### 作用: 1. **保存外部函数的变量**:可以让一个变量常驻于内存。 python def func():a 10def inner():print(a)return areturn inne…...
Windows下docker使用教程
docker安装 镜像制作镜像加载容器创建更新镜像导出镜像 Windows10安装dockerdocker image制作docker 镜像加载docker 容器创建更新imageimage 导出为.tar文件 #以Windows10 、11为例 linux和Windows区别在于docker安装的程序是哪个操作系统的,后面的内容其实不变 …...
Java项目生成接口文档的方案
文章目录 问题:Java项目生成接口文档的方案方案一:Swagger3.0方案二:Apipost两者对比 问题:Java项目生成接口文档的方案 需求 1、需要生成生成时间,作者名称,项目名称,接口名称,请…...
Android第七次面试总结(Java和kotlin源码级区别 )
Java 和 Kotlin 作为用于软件开发尤其是 Android 和后端开发的编程语言,在源码层面存在诸多区别,下面从多个方面进行深入讲解: 1. 基础语法与变量声明 变量声明方式 Java:变量声明时必须明确指定数据类型,并且若要声…...
北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
改进奇偶矢量法的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)安全性的核心技术。针对传统奇偶矢量法在噪声敏感性、多故障隔离能力上的缺陷,本文提出一种基于加权奇偶空间与动态阈值的改进算法。通过引入观测值权重矩阵重…...
案例实践 | 招商局集团以长安链构建“基于DID的航运贸易数据资产目录链”
概览 案例名称 基于DID的航运贸易数据资产目录链 业主单位 招商局集团 上线时间 2024年10月 用户群体 供数用数企业和个人 用户规模 集团内20企业 案例背景 招商局集团深入落实“促进数据高效流通使用、赋能实体经济”精神,深化集团数字化水平,…...
【C++】httplib:轻量级的 HTTP 服务器和客户端
本教程采用渐进式讲解方式,适用于 MinGW 环境。我们将从 httplib 的基本概念入手,通过一个小型 Demo 展示其核心用法,最后深入探讨高级功能与实际应用场景。 1. 简介 1.1 httplib 基本概念 httplib 是一个轻量级的 C HTTP 库,设…...
【算法工程】RAG:针对linux下文档解析出现乱码问题的解决
RAG服务中,非常关键的模块是文档解析。但将解析服务部署到linux平台,解析word、ppt等文档时可能就会出现乱码,核心原因是系统未能识别出对应的字体。因为word、ppt在windows下是最适配的,如果将解析服务部署到linux上,…...
亚马逊云科技全面托管DeepSeek-R1模型现已上线
文章目录 亚马逊云科技全面托管DeepSeek-R1模型现已上线在Amazon Bedrock中开始使用DeepSeek-R1模型DeepSeek-R1现已可用 亚马逊云科技全面托管DeepSeek-R1模型现已上线 亚马逊云科技提供众多免费云产品,可以访问:亚马逊云科技 截至1月30日,D…...
2025年移动端开发性能优化实践与趋势分析
启动速度优化 本质:缩短首次可见帧渲染时间。 方法: iOS:利用Core ML本地模型轻量化部署,减少云端等待。Android:强制启用SplashScreen API,通过setKeepOnScreenCondition控制动画时长。冷启动需将耗时操…...
Docker Compose介绍
基本概念 Docker-Compose是Docker官方的开源项目,负责实现对docker容器集群的快速编排。 可以这么理解,docker compose是docker提出的一个工具软件,可以管理多个docker容器组成一个应用,只需要编写一个YAML格式的配置文件docker…...
openGauss关联列数据类型不一致引起谓词传递失败
今天分享一个比较有意思的案例 注意:因为原始SQL很长,为了方便排版,简化了SQL 下面SQL跑60秒才出结果,客户请求优化 select dtcs.owner, dtcs.table_name, dtcs.column_name, dct.commentsfrom dba_tab_columns dtcsleft outer j…...
头歌实践教学平台--【数据库概论】--SQL
一、表结构与完整性约束的修改(ALTER) 1.修改表名 USE TestDb1; alter table your_table rename TO my_table; 2.添加与删除字段 #语句1:删除表orderDetail中的列orderDate alter table orderDetail drop orderDate; #语句2:添加列unitPrice alter t…...
Unity 全栈开发商业级 MMORPG 大型网游:源码与课件助力进阶之路
Unity 全栈开发商业级 MMORPG 大型网游:源码与课件助力进阶之路 在竞争激烈的游戏市场中,大型多人在线角色扮演游戏(MMORPG)凭借其丰富的世界观、庞大的玩家社区以及持续的内容更新,始终占据着重要地位。Unity 作为一…...
软件工程面试题(六)
1、forward及redirect 的区别?有哪些方式实现 <jsp:forward>重定向后url地址栏地址不变还是原来的地址;而response.sendRedirect()重定向后url地址栏地址显示的请求后的新地址。<jsp:forward>重定向的时候可以保存回话信息,因此可以使用re…...
