简介:本文深入探讨前端如何通过fetch和axios请求deepseek流式接口,从原理到实现细节,提供完整代码示例和错误处理方案,帮助开发者快速掌握流式数据接收技术。
流式接口(Stream API)作为HTTP/1.1引入的核心特性,通过分块传输(Chunked Transfer Encoding)实现数据实时推送。在AI对话场景中,deepseek等大模型采用流式返回可显著提升用户体验——用户无需等待完整响应即可看到部分结果,交互延迟降低60%以上。
技术实现层面,流式接口依赖Transfer-Encoding: chunked头部,服务器将响应拆分为多个数据块(每个块以\r\n分隔,末尾以0\r\n\r\n结束)。前端需持续监听readystatechange事件或通过ReadableStream处理数据流,这对传统Promise-based的请求库提出新挑战。
async function fetchStream() {const response = await fetch('https://api.deepseek.com/stream', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': 'Bearer YOUR_API_KEY'},body: JSON.stringify({prompt: "解释量子计算原理",stream: true})});if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`);if (!response.body) throw new Error('ReadableStream not supported');}
通过response.body.getReader()获取ReadableStreamDefaultReader,循环读取数据块:
const reader = response.body.getReader();const decoder = new TextDecoder();while (true) {const { done, value } = await reader.read();if (done) break;const chunk = decoder.decode(value);// 处理数据块(可能包含多个JSON片段)processChunk(chunk);}
async function fetchDeepseekStream() {try {const response = await fetch('https://api.deepseek.com/v1/chat/stream', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': 'Bearer sk-xxx'},body: JSON.stringify({model: "deepseek-chat",messages: [{role: "user", content: "用JavaScript实现冒泡排序"}],stream: true})});const reader = response.body?.getReader();if (!reader) throw new Error('No reader available');const decoder = new TextDecoder();let buffer = '';while (true) {const { done, value } = await reader.read();if (done) break;buffer += decoder.decode(value, { stream: true });// 处理可能的多个JSON片段while (true) {const delimiterPos = buffer.indexOf('\n\n');if (delimiterPos === -1) break;const jsonStr = buffer.substring(0, delimiterPos);buffer = buffer.substring(delimiterPos + 2);try {const data = JSON.parse(jsonStr.trim());if (data.choices?.[0]?.delta?.content) {console.log('Received:', data.choices[0].delta.content);}} catch (e) {console.error('Parse error:', e);}}}} catch (error) {console.error('Fetch error:', error);}}
axios默认不支持流式响应,需通过transformResponse和onDownloadProgress组合实现:
const instance = axios.create({transformResponse: [data => data], // 禁用默认JSON解析responseType: 'stream' // 关键配置(需axios>=1.3.0)});
async function axiosStreamRequest() {try {const response = await instance({method: 'post',url: 'https://api.deepseek.com/v1/chat/stream',headers: {'Authorization': 'Bearer sk-xxx'},data: {model: "deepseek-chat",messages: [{role: "user", content: "解释P=NP问题"}],stream: true},onDownloadProgress: (progressEvent) => {// 此回调仅能获取总字节数,无法直接处理流}});// 手动处理流(axios不直接暴露ReadableStream)// 实际实现需结合fetch或修改axios源码console.warn('Axios原生不支持流式处理,建议使用fetch或自定义适配器');} catch (error) {console.error('Axios error:', error);}}
注:axios原生对流式支持有限,推荐方案:
axios-stream扩展库
import axios from 'axios';async function hybridStreamRequest() {// 1. 用axios获取请求配置const { data: config } = await axios.post('https://api.deepseek.com/config', {model: "deepseek-chat"});// 2. 用fetch处理流式响应const response = await fetch(config.url, {method: 'POST',headers: config.headers,body: JSON.stringify(config.payload)});// 3. 流式处理逻辑(同fetch方案)// ...}
data: {"content":"部分结果"}\n\n格式,需按\n\n分割TextDecoder的stream: true选项避免字符截断reader.cancel()暂停接收
// 完整错误处理示例try {const response = await fetch(...);// 网络层错误if (!response.ok) {if (response.status === 429) {throw new Error('Rate limit exceeded');}throw new Error(`HTTP ${response.status}`);}// 流处理错误const reader = response.body.getReader();// ...流处理逻辑...} catch (error) {if (error.name === 'TypeError' && error.message.includes('body')) {console.error('不支持流式响应的浏览器');} else if (error.message.includes('401')) {console.error('认证失败,请检查API Key');} else {console.error('未知错误:', error);}}
}
typeof Response.prototype.body?.getReader === 'function';
// 降级方案
if (!isStreamSupported()) {
// 回退到完整响应模式
console.warn(‘流式接口不可用,使用完整响应模式’);
}
2. **TypeScript类型定义**:```typescriptinterface DeepseekStreamResponse {id: string;object: "chat.completion.chunk";created: number;model: string;choices: Array<{index: number;delta: {role?: string;content?: string;};finish_reason?: string;}>;}
| 方案 | 优势 | 局限 | 适用场景 |
|---|---|---|---|
| fetch | 原生支持,无需额外依赖 | 错误处理复杂,API较底层 | 现代浏览器环境 |
| axios | 统一的请求拦截器 | 原生不支持流式响应 | 需要统一错误处理的场景 |
| 混合方案 | 结合两者优势 | 实现复杂度较高 | 大型企业级应用 |
推荐实践:
通过本文提供的实现方案,开发者可快速构建稳定的前端流式接口处理逻辑,在deepseek等AI对话场景中实现类似ChatGPT的实时输出效果,显著提升用户体验。