在前端开发中,采用什么方式可以调用支持 SSE 流式响应的后端接口?
考察说明
考查对 SSE 流式接口前端调用方式的理解与实现细节。
回答思路
- 【回答框架 1】SSE 即 Server-Sent Events,是一种基于 HTTP 的流式传输技术,用于服务器向客户端单向推送数据。前端调用时,可使用内置的 EventSource API,它专门用于订阅 SSE 流。
- 【回答框架 2】使用 EventSource 时,首先创建实例,例如 new EventSource('/api/stream'),然后监听默认的 onmessage 事件获取数据,也可通过 addEventListener 监听自定义事件,如服务端通过 event: 字段指定的类型。
- 【回答框架 3】需要注意,EventSource 只支持 GET 请求,且无法携带自定义请求头,也无法手动设置请求体。若需发送 POST 或添加认证头,不能直接使用 EventSource,可改用 fetch API 结合 ReadableStream 实现流式读取,手动解析 SSE 格式数据。
- 【回答框架 4】当使用 fetch 时,需通过 response.body.getReader() 获取读取器,循环读取二进制块并解码为文本,按 SSE 格式(以空行分隔事件,字段如 data:)解析出实际数据。
- 【回答框架 5】连接建立后,需监听 onopen 事件进行初始化处理,监听 onerror 处理连接中断与自动重连(EventSource 内置重连机制,可自定义重连策略)。在无需接收时,应调用 close() 方法关闭连接,避免资源泄漏。
- 【关键点 1】EventSource API 是前端实现 SSE 最直接的方式,支持自动重连但只支持 GET。
- 【关键点 2】为实现 POST 或自定义请求头,须用 fetch 结合流式读取手动解析 SSE 数据。
- 【关键点 3】SSE 是单向的,仅支持服务器向客户端推送,与 WebSocket 的双向通信有本质区别。
- 【易错点 1】误以为 EventSource 支持 POST 请求,实际它只允许 GET,且无法自定义请求头。
- 【易错点 2】忽略 SSE 事件的格式解析,直接按整段文本处理容易遗漏数据;须正确按空行分隔事件并提取 data 字段。
- 【易错点 3】忘记处理连接异常和相关清理,比如未调用 close() 导致请求持续占用资源,或者组件卸载时未关闭连接引起内存泄漏。