前端接deepseek的流式接口怎样哀求?fetch和axios方案

张裕  论坛元老 | 2025-3-26 22:37:13 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1388|帖子 1388|积分 4164

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
流式哀求方案履历文档

1. 概述

1.1 配景

流式哀求是一种在数据传输过程中渐渐吸收数据的技能,适用于必要实时处理惩罚数据的场景。当前,DeepSeek 是一个热门的 AI 技能,许多开发者都在集成它。然而,流式的 Server-Sent Events (SSE) 方案似乎较少被接纳。本文档将先容怎样利用 Fetch 和 Axios 实现流式哀求,并处理惩罚吸收到的数据。
2. 利用 Fetch 进行流式哀求

2.1 哀求的实现

利用 Fetch API 进行流式哀求,通过 fetch 方法发送哀求,并利用 ReadableStream 渐渐处理惩罚响应数据。
2.2 数据处理惩罚

在吸收到数据块时,利用 TextDecoder 将数据块解码为字符串,并进行相应的处理惩罚。
2.3 停止哀求

通过 AbortController 控制器来停止当前的流式哀求。
3. 利用 Axios 进行流式哀求

3.1 哀求的实现

利用 Axios 进行流式哀求,通过 axios 方法发送哀求,并利用响应流渐渐处理惩罚数据。
3.2 数据处理惩罚

在吸收到数据块时,利用 response.data 处理惩罚数据,并进行相应的处理惩罚。
3.3 停止哀求

通过取消令牌CancelToken来停止当前的流式哀求。
4. 案例代码

4.1 Fetch 示例代码

以下是怎样利用 Fetch API 实现流式哀求的示例代码:
  1. // 初始化 AbortController 用于取消请求
  2. const controller = new AbortController();
  3. const { signal } = controller;
  4. // 使用 Fetch 发起流式请求
  5. fetch("your-endpoint-url", { data, signal })
  6.   .then((response) => {
  7.     // 确保响应是流式的
  8.     if (!response.body)
  9.       throw new Error("ReadableStream not yet supported in this browser.");
  10.     const reader = response.body.getReader();
  11.     const decoder = new TextDecoder("utf-8");
  12.     let receivedLength = 0; // 接收到的字节数
  13.     let chunks = []; // 用于存储数据块的数组
  14.     // 读取流直到结束
  15.     function readStream() {
  16.       return reader.read().then(({ done, value }) => {
  17.         if (done) {
  18.           // 流已结束
  19.           console.log("Stream complete");
  20.           return chunks.join("");
  21.         }
  22.         chunks.push(decoder.decode(value, { stream: true }));
  23.         receivedLength += value.length;
  24.         console.log(`Received ${receivedLength} bytes of data so far`);
  25.         return readStream();
  26.       });
  27.     }
  28.     return readStream();
  29.   })
  30.   .then((data) => {
  31.     // 处理完整的响应数据
  32.     console.log("Full data:", data);
  33.   })
  34.   .catch((error) => {
  35.     if (error.name === "AbortError") {
  36.       console.log("Fetch aborted");
  37.     } else {
  38.       console.error("Fetch error:", error);
  39.     }
  40.   });
  41. // 若要停止请求,可以调用以下函数
  42. function stopFetchRequest() {
  43.   controller.abort();
  44. }
复制代码
4.2 Axios 示例代码

以下是怎样利用 Axios 实现 HTTP 流式哀求的示例代码:
  1. // 初始化取消令牌
  2. let cancelTokenSource = axios.CancelToken.source();
  3. // 使用 Axios 发起流式请求
  4. // callback作为回调函数进行处理,每次都会返回之前所有已返回的数据
  5. export function sendChatMessage(data, callback = () => {}) {
  6.   return createCancelableRequest({
  7.     baseURL: baseURL,
  8.     url: "/v1/chat-messages",
  9.     method: "post",
  10.     responseType: "stream",
  11.     headers: {
  12.       Authorization: `Bearer ${API_TOKEN}`,
  13.     },
  14.     data,
  15.     onDownloadProgress: callback,
  16.   });
  17. }
  18. .then(response => {
  19. // 数据请求全部完成才会返回
  20. })
  21. .catch(error => {
  22.   if (axios.isCancel(error)) {
  23.     console.log('Axios request canceled', error.message);
  24.   } else {
  25.     console.error('Axios request error:', error);
  26.   }
  27. });
  28. // 若要停止请求,可以调用以下函数
  29. function stopAxiosRequest() {
  30.   cancelTokenSource.cancel('Operation canceled by the user.');
  31. }
  32. // callback 示例
  33. const { responseText } = progressEvent.target
  34. // 获取新增的数据
  35. const newData = responseText.slice(buffer.length)
  36. buffer += newData
  37. // 按照数据块分割并解析
  38. const chunks = buffer.split("\n\n")
  39. buffer = chunks.pop() || "" // 缓存最后一个可能不完整的数据块
  40. // 先清空你之前填进去的
  41. chatMessageList.value[currentIndex].answer = ""
  42. chatMessageList.value[currentIndex].think = ""
  43. // 处理每个完整的数据块
  44. chunks.forEach(async chunk => {
  45.         //  处理每行数据
  46.     chatMessageList.value[currentIndex].think += data.answer
  47.      // 滚动到底部
  48.      scrollToBottom()
  49. })
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表