跳到主要内容

SSE 调试

SSE(Server-Sent Events)的全称是服务器推送事件,它是一种基于 HTTP 协议的实时通信技术,用于在客户端和服务器之间建立持久、单向的链接,允许服务器向客户端发送异步消息。

发起 SSE 连接

在 HTTP 项目中新建接口。发起请求后,当接口返回的 Content-Type 包含 text/event-stream 时,Apifox 会自动将返回的数据解析为 SSE 事件,并以全新的时间线视图实时更新响应内容,而不必等待服务器关闭连接。

通过后置操作提取消息内容

在当前接口的后置操作中添加自定义脚本,将每个 SSE 事件中返回的某个字段值提取后,拼接为完整字符串。

以上图请求的接口为例,该接口返回的每个消息内都包含一个 JSON 结构,现希望提取返回中的 answer 字段,将其中的参数内容拼接为完整文本。

在自定义脚本中填写下列示例代码:

// 获取响应的文本
const text = pm.response.text()
// 将文本分割成行
var lines = text.split('\n');
// 创建一个空数组来存储 "answer" 参数
var answers = [];
// 遍历每一行
for (var i = 0; i < lines.length; i++) {
const line = lines[i];
// 跳过不以 data 开头的行
if (!line.startsWith('data:')) {
continue;
}
// 尝试解析 JSON 数据
try {
var data = JSON.parse(line.substring(5).trim()); // 去掉前面的 "data: "
// 获取 "answer" 参数,并将其添加到数组中
answers.push(data.answer);
} catch (e) {
// 如果当前行不是有效的 JSON 数据,就忽略它
}
}
// 使用 join() 方法拼接 "answer" 参数
var result = answers.join('');
// 将结果显示在 body 的“可视化”标签页
pm.visualizer.set(result);
// 打印结果到控制台
console.log(result);

发送请求后将在 Body 中的 Visualize 栏中显示出拼接后的文本。

常见问题

请求 SSE 接口后,为什么底部的“时间线”没有输出有效消息?

错误截图如下所示:

SSE FAQ

这是因为服务器所返回的响应内容不符合 SSE 格式规范,Apifox 无法在时间线内展示消息。服务端可遵循以下 SSE 格式参考:

  • 将消息内容放在 data: 之后
  • 在每条消息结尾使用 2 个换行符,即每条消息之间空一行

如果想要查看对 SSE 消息格式的详细说明,请参考《MDN 文档 - 使用服务器发送事件》