text/event-stream 是一种 HTTP 内容类型,主要用于服务器向客户端发送实时更新的文本数据,通常在服务器发送事件(Server-Sent Events,SSE)场景中使用。例如,在 GPT 领域中,使用 text/event-stream 来实现将产生的文本不断的提供给前端页面。
基本概念
text/event-stream 是一种基于 HTTP 协议的单向数据传输格式,它允许服务器将实时数据以文本流的形式发送到客户端,客户端可以持续接收服务器推送的新数据,而无需频繁地向服务器发送请求来获取更新。这种方式实现了服务器到客户端的实时通信,在 Web 应用程序中用于实现实时更新、推送通知等功能。
数据格式
text/event-stream 的数据格式由一系列的事件组成,每个事件由若干个字段组成,字段之间通过换行符分隔。每个事件通常以 data: 开头,表示数据字段,后面跟着具体的数据内容。例如:
data: {"message": "Hello, World!"}
data: {"message": "This is a test."}
除了 data 字段外,还可以有其他字段,如 event 字段用于指定事件类型,id 字段用于给事件分配唯一标识符,retry 字段用于指定客户端在连接丢失时的重试时间等。例如:
event: update
data: {"status": "success"}
id: 12345
工作原理
- 建立连接:客户端通过HTTP请求向服务器发起连接,请求的
Accept头部字段设置为text/event-stream,表示客户端希望接收text/event-stream格式的数据。服务器接收到请求后,如果支持text/event-stream,则会建立连接,并开始向客户端发送数据。 - 数据发送:服务器根据业务逻辑,将数据以
text/event-stream格式发送到客户端。数据可以是实时生成的,也可以是从数据库或其他数据源获取的。服务器在发送完一条数据后,不会关闭连接,而是等待下一次有数据需要发送时继续发送。 - 客户端接收:客户端在接收到数据后,会根据
text/event-stream的格式进行解析,提取出数据内容,并根据业务需求进行处理。客户端会保持连接打开,持续接收服务器发送的新数据。
与 WebSocket 的比较
- SSE 是基于 HTTP 协议;Websocket 是一种双向的全双工通信协议。
- SSE 只支持单向的服务器到客户端的数据推送;Websocket 支持双向数据传输。
- SSE 客户端发送一个包含
Accept: text/event-stream头部的 HTTP 请求,服务器响应并建立连接;Websocket 需要先基于 HTTP 进行握手后升级为 Websocket 连接。 - SSE 只能传输文本数据;Websocket 默认支持二进制数据,因此若传输文本需要二次解析。