流式响应怎么解析?半截 JSON、中文被拆开怎么办?

先理解原理和示例,再练习完整口述与追问。

字节块先用支持流式解码的 TextDecoder 等机制处理,保留尚未完整的事件片段,按照实际协议划分消息后再解析。不能每次 reader.read() 都直接 JSON.parse。

SSE 还涉及空行分隔、多个 data 行、换行形式和结束事件约定;流结束不等于业务成功,要按服务端协议判断。生产环境优先采用可靠解析器并核对兼容性。

流解析分为编码层和消息层。TextDecoder 的流式模式保留跨块字符状态;消息缓冲区保留尚未完整到达的事件。SSE 要处理空行分隔、多行 data、注释与 CRLF 等规则,不能对每个 chunk 直接 JSON.parse。NDJSON、SSE 和原始文本是不同协议,先明确后端发送格式。

假设第一块为 data: {"text":"你,第二块补齐 好"} 加空行;第一块只能进入缓冲,第二块到达后才有完整事件。代码通常采用 decoder.decode(value,{stream:true}) 追加字符串,再反复提取完整帧,保留尾部;流结束还需 flush decoder 并根据协议处理未完成尾帧。

字符串 split 后丢掉最后一段会造成偶发缺字。协议解析错误应显示可恢复错误并保留已收到内容,不能静默忽略全部异常。

reader.read() 返回字节块,不保证恰好是一条 JSON 或一个 SSE 事件。我先使用 TextDecoder 的流式模式避免多字节字符被截坏,把文本追加到缓冲区,按协议找到完整事件,保留末尾未完成部分;SSE 要处理行结束、空行分隔以及多个 data 行合并。只有完整业务 payload 才 JSON.parse。结束时刷新解码器并按协议判断终止状态;连接断开但没有成功结束事件,应视为中断或错误,而不是自动成功。