更新记录
1.0.5(2026-05-13)
优化代码逻辑,清理无用文件
1.0.3(2026-05-13)
相关文档更新
1.0.2(2026-05-13)
文件清理,无用代码清理
查看更多平台兼容性
uni-app(5.07)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|
| √ | √ | - | - | √ | √ | 5.0 | 1.0.0 | 12 | 1.0.0 | 4 |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.07)
| Chrome | Safari | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 | 鸿蒙插件版本 | 微信小程序 |
|---|---|---|---|---|---|---|---|---|
| × | × | 5.0 | 1.0.0 | 12 | 1.0.0 | 4 | 1.0.0 | - |
itmiao-sse
插件说明
itmiao-sse 是一个跨平台的 Server-Sent Events (SSE) 插件,支持 Android、iOS 和 HarmonyOS 平台。该插件提供了稳定的 SSE 连接管理和流式数据接收功能。
功能特性
- ✅ 支持 SSE 长连接建立
- ✅ 实时流式数据接收(基于 URLSessionDataDelegate / OkHttp EventSource / @ohos.net.http)
- ✅ 多连接管理(支持同时建立多个 SSE 连接)
- ✅ 跨平台兼容(Android、iOS、HarmonyOS)
- ✅ 支持 GET 和 POST 请求方法
- ✅ 支持自定义请求头和请求体
- ✅ 完整的 SSE 协议解析(data、event、id 字段)
- ✅ 连接状态管理和资源清理
- ✅ 防止回调函数被 GC 回收(使用 @UTSJS.keepAlive)
使用方法
导入插件
import { sseConnect, sseOnMessage, sseDisconnect } from '@/uni_modules/itmiao-uts-sse'
建立SSE连接(GET 请求)
sseConnect({
url: 'https://your-sse-server.com/events',
headers: new Map([
['Authorization', 'Bearer your-token']
]),
timeout: 30000,
success: (res) => {
console.log('SSE连接成功, connectionId:', res.connectionId)
// 保存 connectionId 用于后续操作
this.connectionId = res.connectionId
},
fail: (err) => {
console.error('SSE连接失败:', err)
}
})
建立SSE连接(POST 请求 - AI聊天场景)
sseConnect({
url: 'https://your-ai-server.com/chat',
method: 'POST', // 指定 HTTP 方法
body: JSON.stringify({ // 请求体
message: '你好',
userId: '123'
}),
headers: new Map([
['Content-Type', 'application/json'],
['Authorization', 'Bearer your-token']
]),
timeout: 30000,
success: (res) => {
console.log('SSE连接成功, connectionId:', res.connectionId)
this.connectionId = res.connectionId
},
fail: (err) => {
console.error('SSE连接失败:', err)
}
})
监听SSE消息
// 在连接成功后调用
sseOnMessage({
connectionId: this.connectionId, // 使用 sseConnect 返回的 connectionId
onMessage: (message) => {
console.log('收到SSE消息:')
console.log(' data:', message.data) // 消息内容(必需)
console.log(' event:', message.event) // 事件类型(可选)
console.log(' id:', message.id) // 消息ID(可选)
// 如果数据是 JSON 格式,可以解析
try {
const jsonData = JSON.parse(message.data)
console.log('解析后的数据:', jsonData)
} catch (e) {
console.log('原始数据:', message.data)
}
},
onError: (error) => {
console.error('SSE错误:', error.code, error.message)
},
onOpen: () => {
console.log('SSE连接已打开,开始接收消息')
},
onClose: () => {
console.log('SSE连接已关闭')
}
})
注意:sseOnMessage 必须在 sseConnect 成功后调用,并且需要使用返回的 connectionId。
完整示例(Vue 组件)
<template>
<view>
<button @click="connectSSE">连接SSE</button>
<button @click="disconnectSSE">断开连接</button>
<view v-for="msg in messages" :key="msg.id">
<text>{{ msg.data }}</text>
</view>
</view>
</template>
<script>
import { sseConnect, sseOnMessage, sseDisconnect } from '@/uni_modules/itmiao-uts-sse'
export default {
data() {
return {
connectionId: '',
messages: []
}
},
methods: {
connectSSE() {
sseConnect({
url: 'https://your-sse-server.com/events',
timeout: 30000,
success: (res) => {
this.connectionId = res.connectionId
this.registerMessageListener(res.connectionId)
},
fail: (err) => {
console.error('连接失败:', err)
}
})
},
registerMessageListener(connectionId) {
sseOnMessage({
connectionId: connectionId,
onMessage: (message) => {
this.messages.push({
id: Date.now(),
data: message.data,
event: message.event
})
},
onError: (error) => {
console.error('消息错误:', error)
}
})
},
disconnectSSE() {
if (this.connectionId) {
sseDisconnect({
connectionId: this.connectionId,
success: (res) => {
console.log('断开成功')
this.connectionId = ''
this.messages = []
}
})
}
}
}
}
</script>
断开SSE连接
sseDisconnect({
connectionId: 'your-connection-id',
success: (res) => {
console.log('SSE断开连接成功:', res)
},
fail: (err) => {
console.error('SSE断开连接失败:', err)
}
})
API说明
API说明
sseConnect(options: SSEConnectOptions)
建立SSE连接
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | SSE服务器地址 |
| method | string | 否 | HTTP方法,默认 'GET',支持 'POST' 等 |
| body | string | 否 | 请求体(用于POST等),需自行JSON.stringify |
| headers | Map<string, string> | 否 | 请求头 |
| timeout | number | 否 | 连接超时时间(毫秒),默认30000 |
| success | Function | 否 | 连接成功回调,参数: { connectionId: string, status: string } |
| fail | Function | 否 | 连接失败回调,参数: { errCode: number, errMsg: string } |
| complete | Function | 否 | 完成回调(无论成功失败都会执行) |
返回值: 无(通过 success/fail 回调获取结果)
示例:
sseConnect({
url: 'https://example.com/sse',
method: 'POST',
body: JSON.stringify({ query: 'test' }),
headers: new Map([['Authorization', 'Bearer token']]),
success: (res) => {
console.log('Connection ID:', res.connectionId)
}
})
sseOnMessage(options: SSEMessageOptions)
注册SSE消息监听器
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| connectionId | string | 是 | 连接ID(从 sseConnect 的 success 回调中获取) |
| onMessage | Function | 否 | 消息接收回调,参数: { data: string, event?: string, id?: string } |
| onError | Function | 否 | 错误回调,参数: { code: number, message: string } |
| onOpen | Function | 否 | 连接打开回调(立即触发) |
| onClose | Function | 否 | 连接关闭回调(暂未实现) |
注意:
- 必须在
sseConnect成功后调用 - 使用返回的
connectionId作为参数 - 该函数使用
@UTSJS.keepAlive装饰,确保回调不会被 GC 回收
示例:
sseOnMessage({
connectionId: 'sse_1234567890_1234',
onMessage: (message) => {
console.log('Data:', message.data)
if (message.event) {
console.log('Event:', message.event)
}
}
})
sseDisconnect(options: SSEDisonnectOptions)
断开SSE连接
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| connectionId | string | 是 | 要断开的连接ID |
| success | Function | 否 | 断开成功回调,参数: { connectionId: string, status: string } |
| fail | Function | 否 | 断开失败回调 |
| complete | Function | 否 | 完成回调 |
示例:
sseDisconnect({
connectionId: 'sse_1234567890_1234',
success: (res) => {
console.log('断开成功:', res.status)
}
})
注意事项
1. 连接管理
- ✅ 请确保SSE服务器正确配置了CORS策略
- ✅ 在生产环境中请妥善处理连接异常和重连逻辑
- ✅ 及时断开不需要的SSE连接以节省资源
- ✅ Android平台需要网络权限,请在manifest.json中声明
3. 使用流程
- 调用
sseConnect建立连接 - 在
success回调中获取connectionId - 使用
connectionId调用sseOnMessage注册监听器 - 在
onMessage回调中处理接收到的消息 - 不需要时调用
sseDisconnect断开连接
4. SSE 协议支持
- ✅
data:字段 - 消息内容(必需) - ✅
event:字段 - 事件类型(可选) - ✅
id:字段 - 消息ID(可选) - ❌
retry:字段 - 重连时间(暂未实现)
5. 性能优化
- 避免频繁创建和销毁SSE连接
- 及时处理消息,避免阻塞主线程
版本历史
-
v1.1.0 (2026-05-13):
- ✨ 支持 GET 和 POST 请求方法
- ✨ 支持自定义请求体(body参数)
- 🐛 修复 SSE 消息无法接收的问题
- 📝 完善文档和示例代码
-
v1.0.0:
- 🎉 初始版本,支持基本的SSE连接和消息接收功能
技术实现
iOS 平台
- 使用
URLSessionDataDelegate实现流式数据接收 - 三层引用保持机制防止 GC 回收
Android 平台
- 使用 OkHttp EventSource 实现 SSE 支持
- 与 iOS 端保持一致的 API 和行为
常见问题
Q: 为什么收不到消息?
A: 请检查:
- 是否在
sseConnect成功后调用了sseOnMessage - 是否使用了正确的
connectionId - 服务端是否正确发送了 SSE 格式的数据(以
\n\n结尾)
Q: 如何发送 POST 请求?
A: 在 sseConnect 中设置 method: 'POST' 和 body 参数:
sseConnect({
url: 'https://example.com/chat',
method: 'POST',
body: JSON.stringify({ message: 'hello' })
})
Q: 如何处理 JSON 数据?
A: 在 onMessage 回调中解析:
onMessage: (message) => {
try {
const data = JSON.parse(message.data)
// 处理解析后的数据
} catch (e) {
console.error('JSON解析失败', e)
}
}
平台差异说明
HarmonyOS 平台
鸿蒙端使用 @ohos.net.http 模块实现 SSE 功能,具有以下特点:
-
Headers 兼容性:同时支持 Map 类型和普通对象类型的 headers
// Map 类型(推荐) const headers = new Map<string, string>() headers.set('Authorization', 'Bearer token') // 普通对象类型 const headers = { 'Authorization': 'Bearer token' } -
权限配置:插件已自动配置网络权限,无需手动添加
-
流式数据处理:使用 HttpResponse 回调机制处理流式数据
更多详细信息请查看 HARMONY_README.md
许可证
MIT License

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 0
赞赏 0
下载 11897902
赞赏 1914
赞赏
京公网安备:11010802035340号