0

0

DeepSeek API如何实现流式数据在网页端渲染_使用Server-Sent Events接收流式响应

P粉602998670

P粉602998670

发布时间:2026-01-31 15:43:01

|

893人浏览过

|

来源于php中文网

原创

需正确处理SSE协议:一、用fetch+ReadableStream发起请求,响应头含text/event-stream等字段;二、逐行解析data:内容并拼接JSON;三、用textContent追加纯文本防XSS;四、按lastEventId重连并指数退避;五、兼容旧浏览器降级用EventSource或polyfill。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

deepseek api如何实现流式数据在网页端渲染_使用server-sent events接收流式响应

如果您在网页端调用DeepSeek API并希望实时渲染模型返回的流式文本,但响应内容延迟显示或出现乱序、截断现象,则可能是由于未正确处理Server-Sent Events(SSE)协议的数据分块与解析逻辑。以下是实现流式数据在网页端稳定渲染的具体步骤:

一、建立符合SSE规范的HTTP请求

浏览器需通过EventSource或fetch+ReadableStream发起请求,且服务端响应头必须包含text/event-stream类型及必要的缓存禁用指令,否则浏览器将无法持续接收事件流。

1、使用fetch发送POST请求,设置headers中Content-Type为application/json,并在body中传入包含model、messages、stream: true等字段的JSON对象。

2、在fetch的Response对象上调用response.body.getReader()获取可读流,确保不使用response.json()或response.text()等终结型方法。

3、设置request headers中的Accept为text/event-stream,显式声明客户端支持SSE格式。

4、在服务端返回的HTTP响应头中,必须包含Content-Type: text/event-streamCache-Control: no-cacheConnection: keep-alive三项关键字段。

二、解析event: message与data: 字段的原始字节

DeepSeek API的SSE响应并非标准单data行格式,实际每条消息含多行:event: message、id: xxx、data: {json},需逐行扫描换行符并提取data后的内容,否则会将JSON结构体误判为纯文本。

1、对每次read()返回的Uint8Array调用decoder.decode(chunk, {stream: true})转为字符串,避免UTF-8多字节字符被截断。

2、将解码后的字符串按\n分割,遍历每一行,识别以data: 开头的行并去除前缀,保留后续所有字符(包括嵌套JSON中的换行)。

3、当遇到空行时,将已累积的data片段拼接为完整JSON字符串,再通过JSON.parse()提取delta.content字段值。

4、忽略所有不含data: 的行,如event:、id:、retry:等控制字段,防止向UI注入非文本内容。

三、逐字符追加至DOM并防XSS注入

流式内容需以最小粒度更新页面,但直接innerHTML赋值存在脚本执行风险;应仅提取纯文本并使用textContent或createTextNode插入,同时保留换行与空格语义。

1、创建一个预置的

容器,设置CSS white-space: pre-wrap确保换行符生效。

2、每次解析出delta.content后,调用document.getElementById('output').appendChild(document.createTextNode(content))。

元典智库
元典智库

元典智库:智能开放的法律搜索引擎

下载

3、若content含\n字符,在插入前将其替换为'\n',而非
标签,因pre元素原生支持换行渲染。

4、禁止将content作为HTML字符串拼接后赋给innerHTML,防止恶意payload如被执行

四、处理流中断与重连逻辑

网络抖动或服务端超时会导致ReadableStream关闭,此时需检测done状态并触发自动重试,避免用户界面停滞;但重试必须携带上次成功接收的id,否则将重复返回历史片段。

1、在read() Promise拒绝或done为true时,检查lastEventId是否为空,若非空则在请求URL后添加?last_id=xxx参数。

2、设置指数退避重试间隔,首次延迟1秒,第二次2秒,第三次4秒,上限不超过30秒。

3、在重连请求头中添加X-Last-Event-ID: {lastEventId},供服务端定位续传位置。

4、限制最大重试次数为5次,超过后向用户显示“连接已断开,请刷新页面重试”提示。

五、适配不同浏览器的流式读取兼容性

Safari 15.4以下版本不支持ReadableStream默认构造,且部分安卓WebView对TextDecoder.stream()无响应;需降级使用EventSource并手动解析data字段,或引入web-streams-polyfill。

1、检测window.EventSource是否存在,若存在且navigator.userAgent包含Safari,则优先使用EventSource初始化。

2、若使用fetch,则在调用前判断window.ReadableStream是否可用,不可用时加载https://cdn.jsdelivr.net/npm/web-streams-polyfill@3.2.1/dist/ponyfill.min.js

3、对EventSource实例监听message事件,从e.data提取JSON字符串,再执行与步骤二相同的data字段剥离逻辑。

4、禁用EventSource的自动重连机制(设置eventSource.readyState = 0),由自定义逻辑统一控制重试时机与参数。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 25.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号