Visindigo::Network::JsonLinesDecoder Class
class Visindigo::Network::JsonLinesDecoderNDJSON(JSON Lines)流解码器. 详情...
| 头文件: | #include <Network/HttpRequest.h> |
| 自以下版本: | Visindigo 0.17.0 |
| 继承自: | Visindigo::Network::IStreamDecoder |
重实现的公开成员函数
(自 Visindigo 0.17.0 引入) virtual QList<Visindigo::Network::StreamFrame> | feed(const QByteArray &chunk) override |
(自 Visindigo 0.17.0 引入) virtual QList<Visindigo::Network::StreamFrame> | finish() override |
(自 Visindigo 0.17.0 引入) virtual qint64 | getBufferedBytes() const override |
(自 Visindigo 0.17.0 引入) virtual qint64 | getMaxFrameBytes() const override |
(自 Visindigo 0.17.0 引入) virtual void | reset() override |
(自 Visindigo 0.17.0 引入) virtual void | setMaxFrameBytes(qint64 bytes) override |
详细说明
以换行符分帧,每一行构成一个完整帧,帧的 StreamFrame::Data 即该行内容 (不含换行),StreamFrame::Event 与 StreamFrame::Id 恒为空。 空行被跳过,行尾的 \\r 会被剥除,因此 Windows 与 Unix 换行都能正确处理。
这一格式常见于本地推理服务与事件推送接口,典型用法是把它挂到请求上:
request.setStreamDecoder(std::make_shared<JsonLinesDecoder>()); center->request(request)->onFrame(this, [](const StreamFrame& frame) { // frame.Data 是一行 JSON return true; });
Note: 本类只负责切分,不解析 JSON。行内容是否合法由调用方判断, 这样解码器无需关心负载语义,也不会因为 JSON 库的选择而影响接口。
Note: 当累计缓冲超过 setMaxFrameBytes 设定的上限仍未见换行时, 超限部分会被丢弃,以避免无换行的响应把内存吃光。
成员函数文档
[override virtual, since Visindigo 0.17.0] QList<Visindigo::Network::StreamFrame> JsonLinesDecoder::feed(const QByteArray &chunk)
Reimplements: IStreamDecoder::feed(const QByteArray &chunk).
送入新增字节,返回本次能够完整切出的所有帧。未以换行结尾的残余部分 会被保留到下次调用,因此调用方无需关心网络分包的位置。
chunk 新到达的字节,其边界没有任何语义。
这个function 从 Visindigo 0.17.0 开始支持。
[override virtual, since Visindigo 0.17.0] QList<Visindigo::Network::StreamFrame> JsonLinesDecoder::finish()
Reimplements: IStreamDecoder::finish().
流结束时调用。若缓冲区还剩下未以换行结尾的内容,它会被当作最后一个帧返回; 这是必要的,因为服务端完全可以在最后一行的末尾省略换行。
这个function 从 Visindigo 0.17.0 开始支持。
[override virtual, since Visindigo 0.17.0] qint64 JsonLinesDecoder::getBufferedBytes() const
Reimplements: IStreamDecoder::getBufferedBytes() const.
返回尚未切分成帧的字节数。
这个function 从 Visindigo 0.17.0 开始支持。
[override virtual, since Visindigo 0.17.0] qint64 JsonLinesDecoder::getMaxFrameBytes() const
Reimplements: IStreamDecoder::getMaxFrameBytes() const.
返回当前的单帧缓冲上限。
这个function 从 Visindigo 0.17.0 开始支持。
[override virtual, since Visindigo 0.17.0] void JsonLinesDecoder::reset()
Reimplements: IStreamDecoder::reset().
清空内部缓冲,使解码器回到初始状态。重试或重定向后会调用它, 以便下一跳的字节从头开始分帧。
这个function 从 Visindigo 0.17.0 开始支持。
[override virtual, since Visindigo 0.17.0] void JsonLinesDecoder::setMaxFrameBytes(qint64 bytes)
Reimplements: IStreamDecoder::setMaxFrameBytes(qint64 bytes).
设置单帧缓冲上限,默认 1 MiB。请参阅类说明中关于超限行为的解释。
bytes 单帧缓冲上限,单位为字节。
这个function 从 Visindigo 0.17.0 开始支持。