更新记录
1.0.0(2026-09-12) 下载此版本
sse
平台兼容性
uni-app(5.0)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
uni-app x(5.0)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| - | - | - | - | - | - |
chat-sse
uni-app UTS 原生 SSE 分块流式插件。用于 App 端真正按块接收 text/event-stream,避免 uni.request 无 onChunkReceived 时只能等整包、界面卡住的问题。
本仓库业务侧已在 src/utils/chat-sse.js 接入:App 优先走本插件,失败再回退 uni.request;H5 仍走浏览器 fetch 流式。
平台支持
| 平台 | 实现方式 | 说明 |
|---|---|---|
| App-Android | HttpURLConnection 流式读 |
无 OkHttp 依赖,云打包可过;readTimeout = 0 |
| App-iOS | URLSessionDataDelegate |
分块 didReceive data |
| Web / H5 | fetch + ReadableStream |
兜底;业务层也可自用 fetch |
| 微信小程序 | uni.request 整包 |
降级,非主路径 |
安装
插件已内置:src/uni_modules/chat-sse,按路径导入即可:
import { onChatSse, startSse, offChatSse } from '@/uni_modules/chat-sse'
使用前必读
- 必须打自定义调试基座 / 云打包。标准基座不含本插件原生代码,控制台可能提示 UTS 相关警告,属正常现象。
- CLI 创建的部分工程对 UTS 支持不完整,建议用 HBuilderX 打开本项目再打包。
- 改动
utssdk下 Kotlin / Swift /index.uts后,需重新打自定义基座才会生效。
快速开始
持续回调采用官方约定:方法名以 on 开头,且只有一个 callback,可多次触发,无需 @UTSJS.keepAlive(部分环境对装饰器会报 Decorators are not valid here)。
import { onChatSse, startSse, offChatSse } from '@/uni_modules/chat-sse'
// 1. 先注册监听
onChatSse((event) => {
if (event.type === 'chunk') {
// 原始文本增量,需自行按 SSE(data: ...\\n\\n)拼包解析
console.log('chunk', event.data)
} else if (event.type === 'success') {
console.log('stream done')
offChatSse()
} else if (event.type === 'fail') {
console.error(event.errCode, event.errMsg)
offChatSse()
}
})
// 2. 再发起请求
const task = startSse({
url: 'https://example.com/agent/api/agent/weknora/continue-stream/SESSION_ID?message_id=MSG_ID',
method: 'GET', // POST / GET
// 每行:key + Tab + value
headers: [
'Accept\ttext/event-stream',
'Authorization\ttoken YOUR_TOKEN',
].join('\n'),
// GET 可传空字符串;POST 传 JSON 字符串
body: '',
})
// 中止
// task.abort()
// offChatSse()
API
onChatSse(callback)
注册全局 SSE 事件监听。同一时间建议只保留一个监听;新注册会覆盖旧监听。
| 参数 | 类型 | 说明 |
|---|---|---|
| callback | (event: SseEvent) => void |
事件回调,可多次触发 |
offChatSse()
清空当前监听。流结束(success / fail)或主动 abort 后应调用,避免泄漏。
startSse(params)
发起一次流式请求。分块与结束事件通过 onChatSse 抛出。
SseStartParams
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| url | string | 是 | - | 完整请求 URL(含 query) |
| method | string | 否 | POST |
GET / POST 等 |
| headers | string | 否 | '' |
请求头,见下方格式 |
| body | string | 否 | '' |
POST 等有 body 时的字符串;GET 传空 |
headers 格式: 多行文本,每行 key + \\t(Tab)+ value,例如:
Accept text/event-stream
Authorization token xxx
Content-Type application/json
GET 请求请勿强行带 Content-Type: application/json(本插件 Android 侧对 GET 也不会强制写死 JSON Content-Type)。
返回值 SseTask
| 方法 | 说明 |
|---|---|
| abort() | 中止当前连接;插件内会按成功收尾,避免业务一直转圈 |
SseEvent
| 字段 | 类型 | 说明 |
|---|---|---|
| type | string | chunk / success / fail |
| data | string | 可选;chunk 时的增量文本 |
| errCode | number | 可选;fail 时的错误码(HTTP 状态或 -1) |
| errMsg | string | 可选;fail 时的错误信息 |
与业务层配合
本项目中:
- 入口:
src/utils/chat-sse.js的streamViaUtsSse - App:
onChatSse→startSse→consumeSseBuffer解析 SSE - 续传:
GET .../continue-stream/{sessionId}?message_id= - 问答:
POST .../knowledge-chat|agent-chat/{sessionId}
插件只负责字节/文本分块投递,不解析 data: JSON;SSE 协议解析仍在 JS 层完成。
目录结构
uni_modules/chat-sse/
├── package.json
├── README.md
└── utssdk/
├── interface.uts # 类型与参数定义
├── app-android/
│ ├── index.uts # onChatSse / startSse / offChatSse
│ ├── SseClient.kt # HttpURLConnection 实现
│ ├── config.json
│ └── AndroidManifest.xml
├── app-ios/
│ ├── index.uts
│ ├── ChatSseClient.swift
│ └── config.json
├── web/
│ └── index.uts
└── mp-weixin/
└── index.uts
常见问题
1. 控制台提示回调已释放 / Decorators are not valid
- 不要使用
@UTSJS.keepAlive装饰器(部分环境报Decorators are not valid here)。 - 请使用
onChatSse注册监听,再调用startSse。
2. 打包装不上 OkHttp / Unresolved reference okhttp3
- 当前 Android 实现已改为
HttpURLConnection,不再依赖 OkHttp。请确认基座是改完后重新打包的。
3. 标准基座上没分块、一直等到结束
- 标准基座不带本插件原生代码。请打自定义调试基座或正式云打包。
4. 同时发多个 SSE
- 当前监听是模块级单例,后一次
onChatSse会覆盖前一次。并发场景请自行串行化,或扩展为按requestId分发。
版本
- 当前版本:
1.0.0(见package.json) - 实现要点:Android 无三方依赖;持续回调用
onXxx约定;与知识库聊天流式 / 续传对齐

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 97
赞赏 0
下载 12592370
赞赏 1949
赞赏
京公网安备:11010802035340号