ChatGPT API SSE(服务器推送技术)和 Fetch 请求 Accept: text/event-stream 标头案例

这篇具有很好参考价值的文章主要介绍了ChatGPT API SSE(服务器推送技术)和 Fetch 请求 Accept: text/event-stream 标头案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实战代码github代码:chatgpt-google-extension
该代码以Chrome 插件的实用案例讲解了 fetch-sse 的用法,之前这个技术被用得很少,大家基本上都直接用 websocket 了
谷歌插件:chatgpt-google-extension

简述下 SSE 是一个什么技术?以及怎么进行调用

fetch()EventSource 都是用于实现服务器推送事件(Server-Sent Events,SSE)的技术,但它们在实现上有一些不同。下面是它们的优缺点:

fetch() 的优点:

  1. 更灵活的数据处理:使用 fetch() 方法可以更灵活地处理 SSE 数据流,因为我们可以使用 JavaScript 中的任何方法来处理和解析从 SSE 服务器端点接收的数据流。例如,我们可以使用 TextDecoder 对象来解码数据流并将其转换为字符串,然后使用 split() 方法将其拆分为多个行。

  2. 更高的兼容性:fetch() 方法是一个标准的 Web API,支持所有主流的现代浏览器。因此,使用 fetch() 方法可以获得更高的兼容性。

  3. 更好的控制权:使用 fetch() 方法可以更好地控制 SSE 数据流的读取和处理。我们可以手动控制 SSE 数据流的读取进度,而不是依赖于 EventSource 对象的自动控制。

fetch() 的缺点:

  1. 需要手动解析数据:使用 fetch() 方法需要手动解析从 SSE 服务器端点接收的数据流,这需要一些额外的代码和技术。

  2. 无法自动重连:使用 fetch() 方法无法自动重连 SSE 服务器端点。如果与 SSE 服务器端点的连接断开,我们需要手动重新连接。

  3. 无法处理错误:使用 fetch() 方法无法处理 SSE 数据流的错误。如果发生错误,我们需要手动处理并调试代码。

EventSource 的优点:

  1. 自动重连:EventSource 对象提供了自动重连的功能。如果与 SSE 服务器端点的连接断开,EventSource 对象会自动尝试重新连接,并恢复之前的数据流。

  2. 自动解析数据:EventSource 对象自动解析从 SSE 服务器端点接收的数据流,并将其转换为 JavaScript 对象,方便我们进行处理和操作。

  3. 错误处理:EventSource 对象提供了错误处理的功能。如果发生错误,EventSource 对象会触发错误事件,并提供错误信息,方便我们进行调试和处理。

EventSource 的缺点:

  1. 低兼容性:EventSource 对象是一个 HTML5 新增的 Web API,可能不被所有的浏览器所支持。一些旧版的浏览器可能不支持 EventSource 对象。

  2. 可能会出现内存泄漏:使用 EventSource 对象可能会出现内存泄漏的问题,特别是在长时间运行的情况下。因此,我们需要注意释放 EventSource 对象。

综上所述,fetch() 方法和 EventSource 对象都有各自的优缺点。如果你需要更灵活的数据处理

给出两者的实现案例
以下是使用 fetch() 方法和 EventSource 对象实现 SSE 的代码示例:

使用 fetch() 方法:

const endpoint = 'http://example.com/sse';

fetch(endpoint, {
  headers: { 'Accept': 'text/event-stream' },
}).then(response => {
  const reader = response.body.getReader();
  let buffer = '';

  reader.read().then(function process({ done, value }) {
    if (done) {
      console.log('Stream closed');
      return;
    }

    buffer += new TextDecoder('utf-8').decode(value);
    const lines = buffer.split('\n');
    buffer = lines.pop();

    lines.forEach(line => {
      console.log(line);
    });

    // Continue reading
    return reader.read().then(process);
  });
}).catch(error => {
  console.error(error);
});

使用 EventSource 对象:

const endpoint = 'http://example.com/sse';

const eventSource = new EventSource(endpoint);

eventSource.addEventListener('open', event => {
  console.log('Connected to SSE server');
});

eventSource.addEventListener('message', event => {
  console.log(event.data);
});

eventSource.addEventListener('error', error => {
  console.error(error);
});

setTimeout(() => {
  eventSource.close();
  console.log('Connection closed');
}, 60000);

这两个代码示例分别使用了 fetch() 方法和 EventSource 对象来实现 SSE 技术。使用 fetch() 方法需要手动解析从 SSE 服务器端点接收的数据流,而使用 EventSource 对象则自动解析数据。使用 fetch() 方法需要手动控制 SSE 数据流的读取进度,而使用 EventSource 对象则自动控制。两种方式都可以实现 SSE,具体使用哪种方式取决于你的具体需求和场景。

如何弥补 fetch 的三个缺点?

好的,以下是整合在一起的代码示例:文章来源地址https://www.toymoban.com/news/detail-514214.html

const endpoint = 'http://example.com/sse';

function connectSSE() {
  fetch(endpoint, {
    headers: { 'Accept': 'text/event-stream' },
  }).then(response => {
    if (response.status !== 200) {
      // 报错
      throw new Error(`Server responded with ${response.status}`);
    }

    const reader = response.body.getReader();
    let buffer = '';

    reader.read().then(function process({ done, value }) {
      if (done) {
        console.log('Stream closed');
        // 自动重连
        setTimeout(connectSSE, 1000);
        return;
      }

      buffer += new TextDecoder('utf-8').decode(value);
      const lines = buffer.split('\n');
      buffer = lines.pop();

      lines.forEach(line => {
        // 解析 SSE 数据
        const data = parseSSEData(line);
        console.log(data);
      });

      // Continue reading
      return reader.read().then(process);
    }).catch(error => {
      console.error(error);
      // 自动重连
      setTimeout(connectSSE, 1000);
    });
  }).catch(error => {
    console.error(error);
    // 自动重连
    setTimeout(connectSSE, 1000);
  });
}

connectSSE();

function parseSSEData(line) {
  const data = {};
  const fields = line.split(':');

  for (let i = 0; i < fields.length; i++) {
    const field = fields[i].trim();

    if (i === 0) {
      // Event Type
      data.type = field;
    } else if (field.indexOf('data') === 0) {
      // Event Data
      data.data = field.substr(5);
    } else if (field.indexOf('id') === 0) {
      // Event ID
      data.id = field.substr(3);
    } else if (field.indexOf('retry') === 0) {
      // Retry Timeout
      data.retry = field.substr(6);
    }
  }

  return data;
}

到了这里,关于ChatGPT API SSE(服务器推送技术)和 Fetch 请求 Accept: text/event-stream 标头案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SSE(Server-Sent Events,服务器推送事件)和sockets(套接字)通信区别

    SSE(Server-Sent Events,服务器推送事件)和sockets(套接字)都是用于实现实时通信的技术,但它们具有不同的特点和应用场景。 SSE 的优点: 简单易用:SSE 是基于HTTP协议的一种实时通信技术,使用简单,只需要在客户端通过EventSource对象监听服务器推送的事件即可。 可靠性:

    2024年02月15日
    浏览(50)
  • WEB通讯技术。前端实现SSE长连接,nodejs+express搭建简单服务器,进行接口调试,通过curl请求数据

    长连接(Keep-Alive)是一种HTTP/1.1的持久连接技术,它允许客户端和服务器在一次TCP连接上进行多个HTTP请求和响应,而不必为每个请求/响应建立和断开一个新的连接。长连接有助于减少服务器的负载和提高性能。 长连接的HTTP请求方法与普通HTTP请求方法相同,可以使用GET、P

    2024年02月09日
    浏览(50)
  • Web端服务器推送技术原理分析及dwr框架简单的使用(1)

    随着 Ajax技术的兴起,让广大开发人员又一次看到了使用浏览器来替代桌面应用的机会,并且这次机会非常大。Ajax将整个页面的刷新变成页面局部的刷新,并且数据的传送是以异步方式进行,这使得网络延迟带来的视觉差异将会消失。 但是,在浏览器中的 Ajax应用中存在一

    2024年04月25日
    浏览(34)
  • Web端服务器推送技术原理分析及dwr框架简单的使用,html5移动web开发

    缺点  : a) 糟糕的用户体验 b) 对服务器的压力很大,并且造成带宽的极大浪费。 2.2 Ajax 轮询 Ajax隔一段时间(通常使用JavaScript的setTimeout函数)就去服务器查询是否有改变,从而进行增量式的更新。但是间隔多长时间去查询成了问题,因为性能和即时性造成了严重的反比

    2024年04月16日
    浏览(51)
  • ChatGPT API调用+服务器部署【附Git地址】

    运行对话效果图 Git地址: https://gitee.com/cotmier/chat.git 需要海外服务器一台 安装Java环境: yum install -y java-1.8.0-openjdk.x86_64 启动项目: java -jar chat.jar 这是一个最简单的openai调用案例

    2024年02月12日
    浏览(39)
  • chatGPT流式输出前端实现fetch、SSE、websocket

    fetch 本身不直接支持流式输出,但你可以使用 ReadableStream 和 TextDecoder 等 Web Streams API 来实现类似的效果。 在 SSE 中,浏览器通过发送 HTTP GET 请求到服务器上特定的 SSE 端点(endpoint),然后服务器通过该连接发送事件(event)和相关数据到客户端,故SSE 主要使用 GET 请求。E

    2024年02月04日
    浏览(39)
  • chatgpt 逐字输出 使用fetch/eventSource/fetchEventSouce进行sse流式处理

    前端使用vue 先贴最后成功使用的 使用fetchEventSource方法 参考代码:https://blog.csdn.net/cuiyuchen111/article/details/129468291 参考/下载文档:https://www.npmjs.com/package/@microsoft/fetch-event-source?activeTab=readme 以下为后端接口要求 前端代码 遇到的问题: 1.只调用一次事件 但fetch请求发送了两次或

    2024年02月07日
    浏览(41)
  • 在vue2中使用SSE(服务器发送事件)

    SSE(Server-Sent Events,服务器发送事件)是围绕只读Comet 交互推出的API 或者模式。 SSE API允许网页获得来自服务器的更新,用于创建到服务器的单向连接,服务器通过这个连接可以发送任意数量的数据。服务器响应的MIME类型必须是text/event-stream,而且是浏览器中的JavaScript API 能

    2024年02月11日
    浏览(47)
  • SSE与WebSocket分别实现服务器发送消息通知(Golang、Gin)

    服务端推送,也称为消息推送或通知推送,是一种允许应用服务器主动将信息发送到客户端的能力,为客户端提供了实时的信息更新和通知,增强了用户体验。 服务端推送的背景与需求主要基于以下几个诉求: 实时通知:在很多情况下,用户期望实时接收到应用的通知,如

    2024年02月03日
    浏览(46)
  • html5学习笔记19-SSE服务器发送事件(Server-Sent Events)

    https://www.runoob.com/html/html5-serversentevents.html 允许网页获得来自服务器的更新。类似设置回调函数。 demo_sse.php demo_sse.aspx

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包