跳到正文
Yayin Story Studio Yayin Story Studio 项目文档

Visindigo::Network::SSEReply Class

class Visindigo::Network::SSEReply

SSE 请求的句柄. 详情...

头文件: #include <Network/SSERequest.h>
自以下版本: Visindigo 0.17.0
继承自: Visindigo::Network::HttpReply

公开成员函数

(自 Visindigo 0.17.0 引入) QString getLastEventId() const
(自 Visindigo 0.17.0 引入) Visindigo::Network::SSEReply &when(const QString &eventName, std::function<bool (const StreamFrame &)> handler)
(自 Visindigo 0.17.0 引入) Visindigo::Network::SSEReply &when(const QString &eventName, QObject *context, std::function<bool (const StreamFrame &)> handler)
(自 Visindigo 0.17.0 引入) Visindigo::Network::SSEReply &when(std::function<bool (const StreamFrame &)> predicate, QObject *context, std::function<bool (const StreamFrame &)> handler)
(自 Visindigo 0.17.0 引入) Visindigo::Network::SSEReply &whenOnce(const QString &eventName, QObject *context, std::function<bool (const StreamFrame &)> handler)
(自 Visindigo 0.17.0 引入) Visindigo::Network::SSEReply &whenOnce(std::function<bool (const StreamFrame &)> predicate, QObject *context, std::function<bool (const StreamFrame &)> handler)

信号

(自 Visindigo 0.17.0 引入) void reconnecting(qint32 attempt, qint32 delayMs)

详细说明

本类继承自 Visindigo::Network::HttpReply,因此状态机、进度、错误、中止与 生命周期绑定等能力全部复用,只额外提供按事件名或谓词分派的帧路由。

Note: 流式请求下 HttpReply::then 表示"流正常结束",而不是"取到了完整 内容"。事件应当通过 whenHttpReply::onFrame 消费。

另请参阅 Visindigo::Network::SSERequest and Visindigo::Network::HttpReply.

成员函数文档

[since Visindigo 0.17.0] QString SSEReply::getLastEventId() const

返回最近一次服务端给出的事件标识。断线后可用它作为 Visindigo::Network::SSERequest::setLastEventId() 的入参,从断点继续接收。

这个function 从 Visindigo 0.17.0 开始支持。

[signal, since Visindigo 0.17.0] void SSEReply::reconnecting(qint32 attempt, qint32 delayMs)

断线后正在等待重连。attempt 是第几次尝试,delayMs 是即将等待的毫秒数。

Note: 重连会带上最近的事件标识(Last-Event-ID)续传,但服务端并不保证一定 接受它。无法续传时这一段推送就是真的丢了,消费方不应假定事件连续。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::SSEReply &SSEReply::when(const QString &eventName, std::function<bool (const StreamFrame &)> handler)

不带 context 的便利重载,等价于传入 nullptr。

Note: 此时连接的生命周期跟随句柄本身:句柄销毁时连接自动断开,因此不会 造成悬垂指针;但反过来说,句柄存活期间连接也一直存在。带捕获的表达式 建议改用带 context 的重载,以便宿主对象销毁时及时断开。

eventName 要监听的事件名。 handler 处理器,返回 false 表示中止整个流。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::SSEReply &SSEReply::when(const QString &eventName, QObject *context, std::function<bool (const StreamFrame &)> handler)

按事件名注册处理器:只有 Event 与该名字相等的事件才会进入处理器。 同名事件会多次触发,处理器返回 false 表示中止整个流。

按事件名分派是 SSE 最自然的用法,因为服务端通常用它区分 message、\c ping、error 等不同种类的推送。

eventName 要监听的事件名。 context 接收回调的对象;传 nullptr 表示使用本对象。 handler 处理器,返回 false 表示中止整个流。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::SSEReply &SSEReply::when(std::function<bool (const StreamFrame &)> predicate, QObject *context, std::function<bool (const StreamFrame &)> handler)

按谓词注册处理器,适用于不带 event 字段的流——很多服务端只发 data,此时无法按事件名分派,只能按内容特征判断。谓词返回 true 表示命中,随后调用处理器。

predicate 命中判定谓词,返回 true 表示该帧需要交给处理器。 context 接收回调的对象;传 nullptr 表示使用本对象。 handler 处理器,返回 false 表示中止整个流。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::SSEReply &SSEReply::whenOnce(const QString &eventName, QObject *context, std::function<bool (const StreamFrame &)> handler)

when 相同,但只在首次命中时触发一次。适用于"只关心第一次出现的 某个事件"的场景,例如服务端在流开始时推送的一次性元信息。

eventName 要监听的事件名。 context 接收回调的对象;传 nullptr 表示使用本对象。 handler 处理器,返回 false 表示中止整个流。

这个function 从 Visindigo 0.17.0 开始支持。

[since Visindigo 0.17.0] Visindigo::Network::SSEReply &SSEReply::whenOnce(std::function<bool (const StreamFrame &)> predicate, QObject *context, std::function<bool (const StreamFrame &)> handler)

谓词版的一次性处理器:首次命中 predicate 时触发一次,之后不再触发。 常用于“只关心出现的第一个数据帧”这类场景。

Note: “只触发一次”的判定建立在谓词命中之上,而不是建立在处理器返回 true 之上。 即使处理器返回 false(要求中止流),本处理器也不会再次被调用。

predicate 命中判定谓词。 context 接收回调的对象;传 nullptr 表示使用本对象。 handler 处理器,返回 false 表示中止整个流。

这个function 从 Visindigo 0.17.0 开始支持。