返回顶部
首页 > 资讯 > 前端开发 > JavaScript >一文解析ChatGPT 之 Fetch 请求
  • 635
分享到

一文解析ChatGPT 之 Fetch 请求

ChatGPT Fetch请求ChatGPT Fetch 2023-05-14 05:05:46 635人浏览 独家记忆
摘要

目录SSE 介绍咋和 ChatGPT 控制台看到的内容不一样?🙄Server-Sent Events 相对于其他技术的优缺点SSE 介绍 随着 ChatGPT 已生活工作中的一部分

SSE 介绍

随着 ChatGPT 已生活工作中的一部分,介绍其中一种服务器端推送技术——Server-Sent Events (SSE),并简单实现其效果。

SSE 是一种 HTML5 技术,它允许服务器向客户端发送事件,从而实现服务器端推送。相对于 websockets 或长轮询技术,SSE 提供了更简单的方式来实现服务器端推送,并且支持更广泛的客户端和服务器端。

在 SSE 中,客户端通过向服务器端发送一个 Http 请求,请求某个资源,并且指定响应的类型是"text/event-stream"。服务器端在响应请求时,将数据格式化为事件流的形式,并通过 HTTP 响应发送回客户端。客户端通过事件流中的数据,可以实现实时地更新 UI 等操作。

下面是一个 SSE 的 Demo,展示了如何通过 SSE 实现一个简单的服务器端推送应用。

服务端代码:

const express = require('express');
const app = express();
const port = 3600;
app.get('/stream', (req, res) => {
  const { message = '' } = req.query
  // 3个请求头重点,需要返回text/event-stream,告知浏览器以何种类型解析
  res.set({
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
  });
  let step = 0;
  // 定时器依次返回message
  const time = setInterval(() => {
    const data = { message: message[step++]};
    // 每个消息以 \n\n分割
    res.write(`data: ${JSON.stringify(data)}\n\n`);
    if (step > message.length - 1) {
      res.end()
      clearInterval(time)
    }
  }, 500);
});
app.listen(port, () => console.log(`Server running at http://localhost:${port}`));

客户端代码:

// 创建一个EventSource
const eventSource = new EventSource(`/stream?message=${message}`);
// 监听服务器返回的数据
eventSource.onmessage = function (event) {
  console.log(event.data);
};
eventSource.onerror = function () {
  eventSource.close();
};

在上面的代码中,我们通过 EventSource 对象创建了一个 SSE 连接,并指定了服务器端的 URL。当有事件流数据时,onmessage 回调函数会被调用。 network 中可看到一条类型为eventsource的请求,其以下内容

咋和 ChatGPT 控制台看到的内容不一样?🙄

ChatGPT 回车后,并未发送eventsource请求,而是发送了一个 fetch 请求,原因又是什么呢,仔细看

观察上图可得它发送了一个 fetch 的 POST 请求,服务端响应的是一个eventsource,那么 fetch 又能如何实现eventsource响应呢?因为 fetch 并没有onmessage方法~

通过一番查找学习~主要有两个关键的 api

  • fetch 方法 查看文档
  • ReadableStream对象 查看文档

fetch用于发起SSE请求,而EventSource用于处理服务器端推送的数据。结合两个API简单实现一个fetchStream方法

const fetchStream = (url, params) => {
  const { onmessage, onclose, ...otherParams } = params;
  const push = async (controller, reader) => {
    const { value, done } = await reader.read();
    if (done) {
      controller.close();
      onclose?.();
    } else {
      onmessage?.(Uint8ArrayToString(value));
      controller.enqueue(value);
      push(controller, reader);
    }
  };
  // 发送请求
  return fetch(url, otherParams)
    .then((response) => {
      // 以ReadableStream解析数据
      const reader = response.body.getReader();
      const stream = new ReadableStream({
        start(controller) {
          push(controller, reader);
        },
      });
      return stream;
    })
    .then((stream) => new Response(stream, { headers: { 'Content-Type': 'text/html' } }).text());
};

调用方法

fetchStream(`/stream?message=${message}`, {
  method: 'GET',
  headers: {
    'accept': 'text/event-stream',
    'Content-Type': 'application/json',
  },
  onmessage: (res) => {
    // todo
    console.log(res);
  },
});

经过简单封装实现ChatGPT的应答请求效果~

另外推荐一个成熟的第三方依赖fetch-event-source 点击查看

Server-Sent Events 相对于其他技术的优缺点

与WebSockets相比,SSE技术的优点在于

  • 更简单的实现:SSE技术使用标准的HTTP协议来发送和接收数据,因此不需要额外的握手和协议协商步骤。这使得SSE技术的实现更加简单,尤其是对于服务器端。
  • 更广泛的兼容性:SSE技术使用标准的HTTP协议,因此可以被大多数WEB浏览器和服务器端支持。相比之下,WebSockets需要浏览器和服务器端都支持WebSocket协议。
  • 更少的网络开销:SSE技术使用HTTP长连接来实现服务器端推送,因此相比WebSockets需要更少的网络开销和资源消耗。

与长轮询技术相比,SSE技术的优点在于

  • 实时性更好:SSE技术可以实时地向客户端推送数据,因此可以实现更快的响应速度和更好的实时性。
  • 更少的网络开销:SSE技术使用HTTP长连接来实现服务器端推送,因此相比长轮询需要更少的网络开销和资源消耗。
  • 更好的客户端兼容性:SSE技术可以被大多数现代浏览器和设备支持,因此更容易实现客户端兼容性。

总结

最后呈上一个完整的demo,GitHub地址

以上就是一文解析ChatGPT 之 Fetch 请求的详细内容,更多关于ChatGPT Fetch 请求的资料请关注编程网其它相关文章!

--结束END--

本文标题: 一文解析ChatGPT 之 Fetch 请求

本文链接: https://lsjlt.com/news/202750.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文解析ChatGPT 之 Fetch 请求
    目录SSE 介绍咋和 ChatGPT 控制台看到的内容不一样?🙄Server-Sent Events 相对于其他技术的优缺点SSE 介绍 随着 ChatGPT 已生活工作中的一部分...
    99+
    2023-05-14
    ChatGPT Fetch请求 ChatGPT Fetch
  • ChatGPT之Fetch请求实例分析
    本篇内容介绍了“ChatGPT之Fetch请求实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SSE 介绍随着 ChatGPT 已生活...
    99+
    2023-07-05
  • ES6 Fetch API HTTP请求的示例分析
    这篇文章主要为大家展示了“ES6 Fetch API HTTP请求的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ES6 Fetch API HTTP请...
    99+
    2024-04-02
  • fetch网络请求封装示例分析
    本篇内容主要讲解“fetch网络请求封装示例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“fetch网络请求封装示例分析”吧!export default ({ ...
    99+
    2023-06-21
  • fetch网络请求封装示例详解
    export default ({ url, method = 'GET', data = null, }) => { // 请求配置 let opt...
    99+
    2024-04-02
  • chatgpt请求过多怎么解决
    本篇内容介绍了“chatgpt请求过多怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! chatg...
    99+
    2023-02-09
    chatgpt
  • js fetch异步请求使用实例详解
    目录认识异步fetch(url)response.json()结合async和await异常处理post请求总结认识异步 首先我们得明白请求是一个异步的过程。 因为请求需要时间向服务...
    99+
    2024-04-02
  • Node.js 中使用fetch 按JSON格式发post请求的问题解析
    目录Node.js 中使用fetch 按JSON格式发post请求补充:写 Node.js,终于能用 Fetch 发请求了Node.js 中使用fetch 按JSON格式发post请...
    99+
    2023-05-14
    Node.js fetch post请求 Node.js fetch发请求
  • 解析HTTP请求报文(GET、POST)
    目的: 一个WEB服务器需要解析客户端(浏览器)发来的请求,两种常见的请求方式是GET和POST。 GET的请求格式: GET请求没有请求体只有请求头GET请求的请求参数放在URL后加上一个""的后面,参数以key=value的形式传递,参...
    99+
    2023-09-02
    http 网络协议 c++ mysql
  • 聊一聊数据请求中Ajax、Fetch及Axios的区别
    目录Ajax介绍Fetch介绍Axios介绍对比 几种方式的对比总结Ajax介绍 Ajax是XMLHttpRequest 对象提供了对 HTTP 协议的完全的访问,早期的项...
    99+
    2024-04-02
  • Java源码解析之Gateway请求转发
    Gateway请求转发 本期我们主要还是讲解一下Gateway,上一期我们讲解了一下Gateway中进行路由转发的关键角色,过滤器和断言是如何被加载的,上期链接://www.jb51...
    99+
    2024-04-02
  • ChatGPT API SSE(服务器推送技术)和 Fetch 请求 Accept: text/event-stream 标头案例
    实战代码github代码:chatgpt-google-extension 该代码以Chrome 插件的实用案例讲解了 fetch-sse 的用法,之前这个技术被用得很少,大家基本上都直接用 webs...
    99+
    2023-08-31
    服务器 javascript 前端
  • 一文详解CORS与预检请求
    目录CORS预检请求携带了自定义头信息的请求PUT,DELETE方法的请求服务器不允许跨域总结CORS 出于安全性,浏览器限制脚本内发起的跨源 HTTP 请求。例如,XMLHttpR...
    99+
    2023-05-17
    JS CORS与预检请求 CORS 预检请求
  • Tomcat源码解析之Web请求与处理
    目录前言一、EndPoint二、ConnectionHandler三、Coyote四、容器责任链模式前言 Tomcat最全UML类图 Tomcat请求处理过程: Connecto...
    99+
    2024-04-02
  • Android 网络请求框架解析之okhttp与okio
    安卓网络请求 先看一下今天的大纲 导入okhttp和okio依赖 禁用掉明文流量请求的检查 添加访问权限 布局及代码实现 运行结果 下面...
    99+
    2024-04-02
  • Python数据分析之真实IP请求Pandas详解
    前言 pandas 是基于 Numpy 构建的含有更高级数据结构和工具的数据分析包类似于 Numpy 的核心是 ndarray,pandas 也是围绕着 Series 和 DataFrame 两个核心数据结...
    99+
    2022-06-04
    详解 真实 数据
  • 一文分析go中判断请求是http还是https
    本篇文章给大家带来了关于go的相关知识,其中主要给大家聊聊golang中判断请求是http还是https(用于获取当前访问地址),感兴趣的朋友一起来看一下吧,希望对大家有帮助。golang中判断请求是http还是https-用于获取当前访问...
    99+
    2023-05-14
    http Go
  • Python HTTP请求详解:发送、接收和解析网络请求
    在今天的网络世界中,HTTP 请求已成为必不可少的技术,它允许我们与服务器进行通信,获取数据并执行各种操作。Python 作为一门强大的编程语言,提供了丰富的库和工具,使得 HTTP 请求变得更加容易实现。了解并掌握 HTTP 请求的原理...
    99+
    2024-02-23
    Python HTTP 请求 发送请求 接收响应 解析响应
  • pytest解读一次请求多个fixtures及多次请求
    目录一、一个测试函数/fixture一次请求多个fixture二、每个测试函数可以多次请求fixtures(返回值被缓存)跟着节奏继续来探索fixtures的灵活性。 一、一个测试函...
    99+
    2024-04-02
  • pythonFlask框架之HTTP请求详解
    我们的浏览器访问网站时,默认为发送了一个HTTP的GET请求。 在浏览网站时,会经常填写表单,比如填写用户名密码。点击登录后,会跳转到我们的主页。 接下来,我们实现这个案例。 首先我...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作