前端怎么用 EventSource?EventSource 怎么配置请求头及加参数?EventSourcePolyfill 使用方法

前言

在前端开发中,特别是实时数据更新的场景下,EventSource 是一个非常实用的 API。它允许浏览器与服务器建立单向连接,服务器可以持续地发送数据给客户端,而无需客户端不断轮询。本文将详细介绍 EventSource 的使用方法、如何配置请求头及加参数,以及如何使用 EventSourcePolyfill 以兼容不支持该 API 的浏览器。

目录

  1. 什么是 EventSource
  2. EventSource 基本使用
  3. EventSource 配置请求头及加参数
  4. EventSourcePolyfill 的使用
  5. 总结

1. 什么是 EventSource

EventSource 是 HTML5 的一种浏览器 API,属于 Server-Sent Events(SSE) 机制,它使客户端可以订阅服务器的实时数据流。相较于 WebSocket,SSE 是单向的,只允许服务器向客户端发送数据。

适用场景
  • 实时更新,例如股票价格、新闻推送、赛事比分等。
  • 服务器频繁向客户端推送数据的场景,替代轮询机制。
特点
  • 单向通信:服务器向客户端发送消息,客户端不能向服务器发送消息。
  • 自动重连:当连接断开时,EventSource 会自动尝试重新连接服务器。
  • 轻量级:比 WebSocket 更轻量,基于 HTTP 协议,适合需要稳定且轻量的消息传输。

2. EventSource 基本使用

EventSource 的基本用法非常简单,下面我们通过一个例子来演示如何使用它从服务器接收实时消息。

服务器端(Node.js)代码示例

首先,我们创建一个简单的 Node.js 服务来定时发送一些消息给客户端:

// server.js
const http = require('http');http.createServer((req, res) => {res.writeHead(200, {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache','Connection': 'keep-alive','Access-Control-Allow-Origin': '*',});setInterval(() => {const message = `data: Server time: ${new Date().toLocaleTimeString()}`;res.write(message);}, 3000);}).listen(3000, () => {console.log('Server running on port 3000');
});

在上面的代码中,服务器通过 text/event-stream 向客户端发送持续的数据流。

客户端代码示例

在客户端,我们使用 EventSource 来接收来自服务器的数据:

// client.js
const eventSource = new EventSource('http://localhost:3000');eventSource.onmessage = function(event) {console.log('Received message:', event.data);
};eventSource.onerror = function(event) {console.error('EventSource error:', event);
};

运行后,客户端将每 3 秒接收到一次来自服务器的消息。


3. EventSource 配置请求头及加参数

默认情况下,EventSource 无法直接配置请求头。不过我们可以通过以下两种方式为 EventSource 请求添加参数或请求头:

1. URL 参数

我们可以通过将参数附加到 URL 上来传递参数给服务器:

const eventSource = new EventSource('http://localhost:3000?token=12345&userId=alice');

服务器端可以通过 URL 查询参数来解析这些值:

// server.js
const url = require('url');http.createServer((req, res) => {const query = url.parse(req.url, true).query;const token = query.token;const userId = query.userId;console.log(`Received token: ${token}, userId: ${userId}`);res.writeHead(200, {'Content-Type': 'text/event-stream','Cache-Control': 'no-cache','Connection': 'keep-alive',});// 省略其他代码...
}).listen(3000);
2. 使用 XMLHttpRequestfetch 创建 EventSource

由于 EventSource 不允许直接配置请求头,因此可以通过 XMLHttpRequestfetch 创建长连接,然后使用其 response 作为 EventSource 的输入。此方法可以绕过 EventSource 直接配置请求头的限制。

fetch('http://localhost:3000', {method: 'GET',headers: {'Authorization': 'Bearer your-token-here','Custom-Header': 'value'}
}).then(response => {const reader = response.body.getReader();reader.read().then(function processText({ done, value }) {if (done) {return;}// 将读取到的内容转换为字符串console.log(new TextDecoder().decode(value));return reader.read().then(processText);});
});

4. EventSourcePolyfill 的使用

EventSource 在现代浏览器中大部分都支持,但如果你需要兼容一些不支持 EventSource 的旧版浏览器,可以使用 EventSourcePolyfill 来提供兼容性支持。

安装 EventSourcePolyfill

你可以通过 npm 安装 event-source-polyfill

npm install event-source-polyfill

或者使用 CDN 引入:

<script src="https://unpkg.com/event-source-polyfill/src/eventsource.min.js"></script>
使用 EventSourcePolyfill

引入 EventSourcePolyfill 后,它会自动替换浏览器中的原生 EventSource,其用法与原生的 API 一致。你可以像使用 EventSource 一样使用它:

const EventSourcePolyfill = require('event-source-polyfill');const eventSource = new EventSourcePolyfill('http://localhost:3000');eventSource.onmessage = function(event) {console.log('Received message from polyfill:', event.data);
};eventSource.onerror = function(event) {console.error('EventSourcePolyfill error:', event);
};

使用了 EventSourcePolyfill 后,旧版浏览器也能支持 SSE 功能。


5. 总结

本文我们深入介绍了如何在前端使用 EventSource 接收服务器的实时推送消息,如何通过 URL 参数传递数据以及配置请求头,最后还介绍了如何使用 EventSourcePolyfill 使得 EventSource 能在旧版浏览器中正常工作。EventSource 是一种非常轻量级的实现实时数据更新的技术,适用于需要服务器单向推送消息的场景,特别是在实时数据展示和动态更新方面有广泛的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

188-下翻便携式6U CPCI工控机箱

一、板卡概述 下翻式CPCI便携工控机,系统采用6u cpci背板结构,1个系统槽,7个扩展槽, 满足对携带的需求,可装标准6U8槽CPCI主板,8个扩展槽, 满足客户对空间扩展的需求.可宽温服务的工作产品,15高亮度液晶显示屏,超薄88键笔记本键盘,触摸式鼠标,加固型机箱结构,使它能够适应各种复…

网页核心页面设计(第9章)

一、多个边框阴影 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-…

SpringBoot中Selenium详解

文章目录 SpringBoot中Selenium详解一、引言二、集成Selenium1、环境准备1.1、添加依赖 2、编写测试代码2.1、测试主类2.2、页面对象2.3、搜索组件 三、使用示例四、总结 SpringBoot中Selenium详解 一、引言 在现代软件开发中&#xff0c;自动化测试是提高软件质量、减少重复…

Edge SCDN的独特优势有哪些?

强大的边缘计算能力 Edge SCDN&#xff08;边缘安全加速&#xff09;是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术&#xff0c;智能调度使用户就近获取所需内容&#xff0c;为用户提供稳定快速的访问…

Fastapi教程:使用aioredis异步访问redis

本文将介绍如何使用 FastAPI 异步访问 Redis&#xff0c;包括环境配置、连接创建、数据库初始化、增删查改操作、键过期、管道&#xff08;pipeline&#xff09;操作以及事务管理等内容。 环境准备 首先&#xff0c;我们需要安装必要的依赖包。Redis 是一个键值存储系统&…

duxapp 2024-12-09 更新 PullView可以弹出到中间,优化CLI使用体验

UI库 修复 Button 禁用状态失效的问题Modal 组件即将停用&#xff0c;请使用 PullView 基础库 PullView side 新增 center 指定弹出到屏幕中间PullView 新增 duration 属性&#xff0c;指定动画时长新增 useBackHandler hook 用来阻止安卓端点击返回键 RN端 修复 windows …

多线程与线程互斥

目录 引言 一、多线程设计 多线程模拟抢票 二、互斥锁 互斥量的接口 修改抢票代码 锁的原理 锁的封装&#xff1a;RAII 引言 随着信息技术的飞速发展&#xff0c;计算机软件正变得越来越复杂&#xff0c;对性能和响应速度的要求也日益提高。在这样的背景下&#xff0c;…

Vue导出报表功能【动态表头+动态列】

安装依赖包 npm install -S file-saver npm install -S xlsx npm install -D script-loader创建export-excel.vue组件 代码内容如下&#xff08;以element-ui样式代码示例&#xff09;&#xff1a; <template><el-button type"primary" click"Expor…

ZUC256 Go Go Go!!!

文章目录 背景运行效果代码 背景 因业务需要使用ZUC算法&#xff0c;GitHub上又没有对ZUC256相对应的Go语言的实现。 吃水不忘挖井人&#xff0c;在这里感谢GmSSL及BouncyCastle两个强大的密码学库&#xff01; 本ZUC256的编写&#xff0c;参考了这两个库及中科院软件院发布的…

力扣打卡12:复原IP地址

链接&#xff1a;93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 这道题需要对字符串进行操作&#xff0c;我选择了三层循环&#xff0c;其实还可以递归。 我在循环时进行了剪枝&#xff0c;比如一些情况直接跳出循环。 我的代码&#xff1a; class Solution { p…

The ‘.git/hooks/pre-push‘ hook was ignored because it‘s not set as executable.

Mac上使用Git提交代码提示&#xff1a; hint: The .git/hooks/prepare-commit-msg hook was ignored because its not set as executable. hint: You can disable this warning with git config advice.ignoredHook false. hint: The .git/hooks/commit-msg hook was ignored b…

【实践·专业课】内存管理-存储管理-文件系统

1. 基于Linux的简单区块链实现 1.1. 环境准备 确保使用的 Linux 系统&#xff08;如 Ubuntu、CentOS 等&#xff09;已安装 Python 3。 在终端输入python3命令&#xff0c;若出现 Python 解释器的版本信息等提示&#xff0c;则表示已安装&#xff1b; 若提示未找到命令&…

MySQL 学习 之 批量插入数据性能问题

文章目录 现象优化 现象 在使用 kettle 同步大数据的数据到我们的 MySQL 数据库中时发现&#xff0c;数据量大时插入效率很慢&#xff0c;大约在 2000/s 优化 在 MySQL 驱动连接中添加 rewriteBatchedStatementstrue 参数&#xff0c;减少 网络 IO DB IO 耗时 默认关闭指定…

2个GitHub上最近比较火的Java开源项目

1. SpringBlade 微服务架构 标题 SpringBlade 微服务架构 摘要 SpringBlade 是一个由商业级项目升级优化而来的微服务架构&#xff0c;采用Spring Boot 3.2、Spring Cloud 2023等核心技术构建&#xff0c;遵循阿里巴巴编码规范&#xff0c;提供基于React和Vue的两个前端框架&am…

MongoDB 建模调优change stream实战

MongoDB开发规范 &#xff08;1&#xff09;命名原则。数据库、集合命名需要简单易懂&#xff0c;数据库名使用小写字符&#xff0c;集合名称使用统一命名风格&#xff0c;可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。 &#xff08;2&#xff09…

Ubuntu 环境美化

一、终端选择 zsh 参考文章使用 oh-my-zsh 美化终端 Oh My Zsh 是基于 zsh 命令行的一个扩展工具集&#xff0c;提供了丰富的扩展功能。 先安装zsh再安装Oh My Zsh 1.zsh安装 sudo apt-get install zsh 2.设置默认终端为 zsh chsh -s /bin/zsh 3.安装 oh-my-zsh 官网&…

MySQL 在线 DDL 变更的一个异常问题

文章目录 前言1. 模拟现场2. 原因推测3. 如何解决4. 误导报错后记 前言 业务执行一条 DDL engineinnodb 失败了很多次&#xff0c;报错 ERROR 1062 (23000): Duplicate entry xxx for key ‘xxx’&#xff0c;在官方文档中也提到过&#xff0c;Online DDL 期间可能会出现 ERRO…

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了&#xff0c;也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是…

微前端框架micro-app中的数据通信机制

在微前端框架micro-app中&#xff0c;getData方法和addDataListener方法都是用于数据通信的重要工具&#xff0c;但它们在使用方式和功能上存在一些显著的差别。 getData方法 功能&#xff1a;getData方法用于直接获取micro-app框架注入的全局对象window.microApp中存储的数据…

操作系统的文件系统

文件系统的基本组成 ⽂件系统是操作系统中负责管理持久数据的⼦系统&#xff0c;说简单点&#xff0c;就是负责把⽤户的⽂件存到磁盘硬件中&#xff0c; 因为即使计算机断电了&#xff0c;磁盘⾥的数据并不会丢失&#xff0c;所以可以持久化的保存⽂件。 ⽂件系统的基本数据单位…