前端发送Fetch请求实现流式请求、模拟打字机效果等

  • 前端需要接收后端的流式返回数据,并实时渲染。
    普通的xhr请求都是等http协议数据包一次性返回之后才渲染,类似于ChatGPT的Http接口内容类型为text/event-stream。这种内容类型需要与浏览器建立持久连接并持续监听服务器返回的数据。

  • npm 方式安装类库

npm install @microsoft/fetch-event-source
  • 使用
let controller = new AbortController()
        const eventSource = fetchEventSource(fetchUrl, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify(
              params
          ),
          signal: controller.signal,
          onopen() {
            console.log('open')
          },
          onmessage(event) {
            console.log('onMessage',event.data)
            let data = event.data
            let jsonData = JSON.parse(data);
          },
          onclose() {
            controller.abort();//出错后不要重试
            eventSource.close();
          },
          onerror(error) {
            console.log('close',error)
            controller.abort();//出错后不要重试
            eventSource.close();
          }

        })
      }

调用 fetchEventSource API可以返回一个对象,这个对象可以控制在连接失败时不要重试,直接关闭本次连接。

  1. onopen:建立连接的回调
  2. onmessage:接收一次数据段时回调,因为是流式返回,所以这个回调会被调用多次。
  3. onclose:正常结束的回调
  4. onerror:连接出现异常回调

onmessage的主要逻辑就是累加所有流式数据返回的内容,然后渲染到页面上,这里需要注意的是接口返回的为markdown格式的数据,所以还需要用到一个markdown转html的依赖库。

  • 光标闪烁效果模拟

这里其实是用了一个span来模拟实现的

 const cursorFlaskStr = "<span id='cursorFlask' style='opacity:1;font-weight: bold'>|</span>"
      setInterval(() => {
        let cursorFlask = document.getElementById("cursorFlask");
        if (cursorFlask) {
          let opacity = cursorFlask.style.opacity;
          if (opacity && opacity.trim() == '0') {
            cursorFlask.style.opacity = '1'
          } else {
            cursorFlask.style.opacity = '0'
          }
        }
      }, 245)

这里的逻辑是每次监听到后端的流式数据以后,动态拼接上已有的字符串,然后将markdown转为html格式,然后继续拼接上这个span标签一起渲染到页面上,这个时候再开启个定时器,定时器获取到这个标签,动态的调整这个标签的opcatity透明度就可以实现光标闪烁的效果了。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 前端可以使用`fetch()`或`XMLHttpRequest`对象来发送POST请求。以下是使用这两种方法的示例: 使用fetch(): ``` fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then(response => { // 处理响应 }) .catch(error => { // 处理错误 }); ``` 其中,`url`是请求的URL,`data`是要发送数据,`JSON.stringify()`方法将数据转换为JSON格式。`headers`指定请求头的Content-Type为application/json,表示请求体为JSON格式。 使用XMLHttpRequest: ``` var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // 处理响应 } }; xhr.send(JSON.stringify(data)); ``` 其中,`url`是请求的URL,`data`是要发送数据,`JSON.stringify()`方法将数据转换为JSON格式。`setRequestHeader()`方法指定请求头的Content-Type为application/json,表示请求体为JSON格式。`onreadystatechange`事件处理程序在请求完成后处理响应。`xhr.readyState`为4时表示请求已完成,`xhr.status`为200表示响应成功。 ### 回答2: 前端发送POST请求是一种常见的数据传输方式,用于向服务器发送数据并获取响应。在前端开发中,通常使用XMLHttpRequest或Fetch API来实现发送POST请求。 使用XMLHttpRequest发送POST请求的方法如下: 1. 创建一个XMLHttpRequest对象:`var xhr = new XMLHttpRequest();` 2. 设置请求方法和URL:`xhr.open("POST", "http://example.com/api", true);` 3. 设置请求头:`xhr.setRequestHeader("Content-type", "application/json");` 4. 监听请求状态改变事件:`xhr.onreadystatechange = function() { ... };` 5. 发送请求并传输数据:`xhr.send(JSON.stringify(data));` 其中,第2步中的URL是请求的目标地址,可以是相对路径或绝对路径。第3步中的请求头设置了数据的格式,可以根据实际情况选择不同的格式,常见的有application/json和application/x-www-form-urlencoded。 使用Fetch API发送POST请求的方法如下: 1. 使用fetch函数发送请求并传输数据:`fetch("http://example.com/api", { method: "POST", headers: { "Content-type": "application/json" }, body: JSON.stringify(data) })` 2. 处理响应数据:`.then(response => response.json()).then(data => { ... })` 与XMLHttpRequest相比,Fetch API提供了更简洁的语法和更强大的功能,但它不支持IE浏览器。 在发送POST请求时,需要注意以下几点: 1. 确保目标服务器允许跨域请求,否则可能会遇到跨域访问限制。 2. 确定请求数据格式,并设置正确的Content-type请求头。 3. 根据服务器的要求,将请求数据转换为相应的格式,常见的有JSON和表单数据。 通过前端发送POST请求,可以实现与服务器的数据交互,完成用户注册、登录、提交表单等常见的操作。 ### 回答3: 前端发送 POST 请求是一种向服务器发送数据的方式,一般用于向服务器提交表单或者发送用户数据。在前端开发中,我们可以使用 JavaScript 来发送 POST 请求发送 POST 请求的基本步骤如下: 1. 创建一个 XMLHTTPRequest 对象。 2. 设置请求方法为 POST,并指定请求的 URL。 3. 设置请求头,通常为 `"Content-Type": "application/x-www-form-urlencoded"` 或者 `"Content-Type": "application/json"`。 4. 将要发送数据转换为字符串,并作为请求参数发送。 5. 监听 XMLHttpRequest 的状态变化,等待服务器响应。 6. 接收服务器响应并处理。 这里是一个使用 JavaScript 发送 POST 请求的示例代码: ``` function sendPostRequest(url, data) { var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var response = JSON.parse(xhr.responseText); // 处理服务器响应 } }; var jsonData = JSON.stringify(data); // 将要发送数据转换为 JSON 字符串 xhr.send(jsonData); } // 调用发送 POST 请求的函数 var url = "http://example.com/api"; var data = { name: "John", age: 25 }; sendPostRequest(url, data); ``` 在实际开发中,根据需求的不同,可以使用其他的方式发送 POST 请求,例如使用 jQuery 的 `$.ajax` 方法、使用 Fetch API 等。不过基本的原理和步骤都是类似的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值