GO GIN SSE DEMO
文章目录
- 接口描述:
- 1.1 `/events/time` - 时间流
- 1.2 `/events/numbers` - 数字流
- 2. 用户管理接口
- 2.1 `/user/:id` - 获取用户信息
- 2.2 `/user` - 创建用户
- 项目结构
- 1. `main.go`
- 2. 创建 `handlers/event_time.go`
- 3. 创建 `handlers/event_number.go`
- 4. `handlers/user.go`
- 5. 运行服务器
- 小结
将GIN项目与SSE库结合,写一个简单的demo,具备正常的API接口和流处理接口,实现了两种类型的 Server-Sent Events (SSE) 流,以及一个简单的用户管理接口。
下面是对每个接口的详细描述:
接口描述:
####1. SSE 接口
1.1 /events/time - 时间流
- 功能:每秒向客户端发送一次当前的时间。
- 路径:
/events/time - 请求方式:
GET - 返回格式:SSE(文本事件流
text/event-stream) - 数据内容:每条消息包含当前时间,格式为 RFC3339,例如:
data: 2024-09-14T15:00:00Z - 实现细节:
- 使用 Gin 处理 HTTP 请求。
- 设置 HTTP 头以指示客户端进行流式传输。
- 通过
for循环持续发送当前时间,并使用flusher.Flush()刷新输出缓冲区,确保数据实时传送到客户端。 - 每次发送时间后,等待 1 秒钟。
1.2 /events/numbers - 数字流
- 功能:每 2 秒向客户端发送一个递增的数字。
- 路径:
/events/numbers - 请求方式:
GET - 返回格式:SSE(文本事件流
text/event-stream) - 数据内容:每条消息包含一个递增的数字,例如:
data: 0,data: 1,data: 2等。 - 实现细节:
- 与时间流相似,设置 HTTP 头并初始化 SSE 传输。
- 使用
for循环持续发送递增的数字,每发送一次数字后,等待 2 秒钟。
2. 用户管理接口
2.1 /user/:id - 获取用户信息
- 功能:根据用户 ID 获取用户信息。
- 路径:
/user/:id - 请求方式:
GET - 参数:
id:用户的唯一标识符,通过 URL 参数传递。
- 返回格式:JSON
- 数据内容:返回包含用户 ID 和名称的 JSON 对象,例如:
{"user_id": "1", "name": "John Doe"} - 实现细节:
- 从 URL 中获取用户 ID。
- 假设从数据库或其他数据源获取用户信息,当前示例中返回了硬编码的用户信息。
2.2 /user - 创建用户
- 功能:创建一个新的用户。
- 路径:
/user - 请求方式:
POST - 请求体:JSON 格式,包含用户名称,例如:
{"name": "Alice"} - 返回格式:JSON
- 数据内容:返回新创建的用户信息,包括用户 ID 和名称,例如:
{"user_id": "12345", "name": "Alice"} - 实现细节:
- 解析请求体中的 JSON 数据,获取用户名称。
- 验证数据是否合法。
- 假设将用户信息存储到数据库或其他存储系统,当前示例中返回了硬编码的用户 ID 和名称。
项目结构
project/
│
├── main.go
├── handlers/
│ ├── event_number.go
│ ├── event_time.go
│ ├── user.go
1. main.go
main.go 文件会引入所有的路由注册函数,包括 event_time 和 event_number。
package mainimport ("project/handlers""github.com/gin-gonic/gin"
)func main() {router := gin.Default()// 注册 SSE 路由handlers.RegisterEventTimeRoutes(router)handlers.RegisterEventNumberRoutes(router)// 注册用户路由handlers.RegisterUserRoutes(router)router.Run(":8080")
}
2. 创建 handlers/event_time.go
event_time.go 文件只处理时间流的 SSE 接口。
package handlersimport ("fmt""net/http""time""github.com/gin-gonic/gin"
)func RegisterEventTimeRoutes(router *gin.Engine) {router.GET("/events/time", timeStream)
}// 时间流
func timeStream(c *gin.Context) {c.Writer.Header().Set("Content-Type", "text/event-stream")c.Writer.Header().Set("Cache-Control", "no-cache")c.Writer.Header().Set("Connection", "keep-alive")flusher, ok := c.Writer.(http.Flusher)if !ok {c.String(http.StatusInternalServerError, "Streaming unsupported!")return}for {// 发送当前时间fmt.Fprintf(c.Writer, "data: %s\n\n", time.Now().Format(time.RFC3339))flusher.Flush()time.Sleep(1 * time.Second)}
}
3. 创建 handlers/event_number.go
event_number.go 文件只处理数字流的 SSE 接口。
package handlersimport ("fmt""net/http""time""github.com/gin-gonic/gin"
)func RegisterEventNumberRoutes(router *gin.Engine) {router.GET("/events/numbers", numbersStream)
}// 数字流
func numbersStream(c *gin.Context) {c.Writer.Header().Set("Content-Type", "text/event-stream")c.Writer.Header().Set("Cache-Control", "no-cache")c.Writer.Header().Set("Connection", "keep-alive")flusher, ok := c.Writer.(http.Flusher)if !ok {c.String(http.StatusInternalServerError, "Streaming unsupported!")return}number := 0for {// 发送递增的数字fmt.Fprintf(c.Writer, "data: %d\n\n", number)flusher.Flush()number++time.Sleep(2 * time.Second)}
}
4. handlers/user.go
user.go 文件保持不变,用于处理用户相关的接口。
package handlersimport ("net/http""github.com/gin-gonic/gin"
)func RegisterUserRoutes(router *gin.Engine) {router.GET("/user/:id", getUser)router.POST("/user", createUser)
}func getUser(c *gin.Context) {userId := c.Param("id")// 假设在这里处理获取用户信息的逻辑c.JSON(http.StatusOK, gin.H{"user_id": userId,"name": "John Doe",})
}func createUser(c *gin.Context) {var json struct {Name string `json:"name" binding:"required"`}if err := c.ShouldBindJSON(&json); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 假设在这里处理创建用户的逻辑c.JSON(http.StatusCreated, gin.H{"user_id": "12345","name": json.Name,})
}
5. 运行服务器
-
将
main.go、event_time.go、event_number.go和user.go保存到项目中。 -
运行项目:
go run main.go -
服务器将在
localhost:8080上运行。
小结
- 模块化:将每个 SSE 接口拆分到单独的文件中,可以提高代码的可读性和可维护性。
- 路由注册:在
main.go中分别调用RegisterEventTimeRoutes和RegisterEventNumberRoutes注册各自的路由。 - 灵活扩展:这种结构可以很容易地扩展新的 SSE 接口,只需创建新的文件并注册路由。
这样做可以让每个文件更专注于自己的任务,保持代码清晰整洁,有利于团队合作和代码维护。
相关文章:
GO GIN SSE DEMO
文章目录 接口描述:1.1 /events/time - 时间流1.2 /events/numbers - 数字流 2. 用户管理接口2.1 /user/:id - 获取用户信息2.2 /user - 创建用户 项目结构1. main.go2. 创建 handlers/event_time.go3. 创建 handlers/event_number.go4. handlers/user.go5. 运行服务…...
GEE教程:1950-2023年ECMWF数据中积雪的长时序统计分析
目录 简介 数据 函数 millis() Arguments: Returns: Long 代码 结果 简介 1950-2023年ECMWF数据中积雪的长时序统计分析 数据 ECMWF/ERA5_LAND/DAILY_AGGR是由欧洲中期天气预报中心(ECMWF)提供的数据集。它是一个格网数据集,包含从ERA5-Land再分析数据集中得出的…...
【React Native】路由和导航
RN 中的路由是通过 React Navigation 组件来完成的 Stack 路由导航RN 中默认没有类似浏览器的 history 对象在 RN 中路由跳转之前,需要先将路由声明在 Stack 中<Stack.Navigator initialRouteNameDetails> <Stack.Screen nameDetails /> </Stack.N…...
Linux环境基础开发工具---vim
1.快速的介绍一下vim vim是一款多模式的编辑器,里面有很多子命令,来实现代码编写操作。 2.vim的模式 vim一共有三种模式:底行模式,命令模式,插入模式。 2.1vim模式之间的切换 2.2 谈论常见的模式---命令模式…...
python AssertionError: Torch not compiled with CUDA enabled
查看:torch import torch# 输出带CPU,表示torch是CPU版本的 print(ftorch的版本是:{torch.__version__}) # print(ftorch是否能使用cuda:{torch.cuda.is_available()}) 修改一下代码,将cuda改成cpu 最后运行正常&…...
Pandas的入门操作-Series对象
Pandas的数据结构 Series对象 class pandas.Series(dataNone, indexNone) data参数 含义:data是Series构造函数中最主要的参数,它用来指定要存储在Series中的数据。 数据类型:data可以是多种数据类型,例如: Python 列…...
自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十八搜索引擎项目实战》搜索引擎系统架构设计…...
H5依赖安装
依赖安装 git和sourceTree编辑器使用vscode下载nvm 和nodejs git和sourceTree 使用 ssh-keygen -t rsa 进行密钥获取 git下载地址:https://git-scm.com/ sourceTree下载地址:https://www.sourcetreeapp.com/ 编辑器使用vscode 最新版网址:…...
MatchRFG:引领MemeCoin潮流,探索无限增长潜力
Meme币无疑是本轮牛市最热闹的赛道,而围绕Meme币的讨论话题基本都集中在价格炒作上。似乎人们习惯性地认为,Meme币的创造和成长往往与真正的价值无关。热炒过后,价格能否通过共识转化为价值,也正是许多Meme币在热潮冷却后的主要成…...
2024/9/18 模型的存储与读取
一、模型的存储与读取 主要涉及到torch.save和torch.load函数 新建两个python文件: 1.在model_save文件中保存模型(方式一)和模型参数(方式二) 2.在model_load文件中读取模型(方式一)和模型参数并装载模型(方式二)...
在 fnOS上安装 KVM 虚拟化,并使用 Cockpit 网页管理虚拟机
在fnOS系统上安装 KVM 虚拟化,并使用 Cockpit 进行网页管理,可以按照以下步骤进行: 1. 安装 KVM虚拟化组件 首先,更新软件列表和系统包: sudo apt update && sudo apt upgrade -y 安装 KVM 及相关工具软件&…...
VUE实现刻度尺进度条
一、如下图所示效果: 运行后入下图所示效果: 实现原理是用div画图并动态改变进度, 二、div源码 <div style"width: 100%;"><div class"sdg_title" style"height: 35px;"><!--对话组[{{ dialo…...
ZYNQ FPGA自学笔记~点亮LED
一 ZYNQ FPGA简介 ZYNQ FPGA主要特点是包含了完整的ARM处理系统,内部包含了内存控制器和大量的外设,且可独立于可编程逻辑单元,下图中的ARM内核为 ARM Cortex™-A9,ZYNQ FPGA包含两大功能块,处理系统Processing System…...
攻击者如何在日常网络资源中隐藏恶意软件
近二十年来,安全 Web 网关 (SWG) 一直在监控网络流量,以检测恶意软件、阻止恶意网站并保护企业免受基于 Web 的威胁。 然而,攻击者已经找到了许多绕过这些防御措施的方法,SquareX的安全研究人员对此进行了记录。 最危险的策略之…...
《深度学习》深度学习 框架、流程解析、动态展示及推导
目录 一、深度学习 1、什么是深度学习 2、特点 3、神经网络构造 1)单层神经元 • 推导 • 示例 2)多层神经网络 3)小结 4、感知器 神经网络的本质 5、多层感知器 6、动态图像示例 1)一个神经元 相当于下列状态&…...
“中秋快乐”文字横幅的MATLAB代码生成
中秋快乐呀朋友们!!! 给大家带来一个好玩的代码,能够生成“中秋快乐”的横幅文字,比较简单,当然你也可以根据自己的需求去更改文字和背景,废话不多说,直接展示。 文字会一直闪烁&…...
【Node.js】RabbitMQ 延时消息
概述 在 RabbitMQ 中实现延迟消息通常需要借助插件(如 RabbitMQ 延迟队列插件),因为 RabbitMQ 本身不原生支持延迟消息。 延迟消息的一个典型场景是,当消息发布到队列后,等待一段时间再由消费者消费。这可以通过配置…...
前后端分离Vue美容店会员信息管理系统o7grs
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取 技术栈介绍 本课题的研究方法和研究步骤基本合理,难度适中,本选题是学生所学专业知识的延续,符合…...
初学Linux(学习笔记)
初学Linux(学习笔记) 前言 本文跳过了Linux前期的环境准备,直接从知识点和指令开始。 知识点: 1.目录文件夹(Windows) 2.文件内容属性 3.在Windows当中区分文件类型是通过后缀,而Linux是通过…...
新增的标准流程
同样的新增的话我们也是分成两种, 共同点: 返回值都是只需要一个Result.success就可以了 接受前端的格式都是json格式,所以需要requestbody 1.不需要连接其他表的 传统方法,在service层把各种数据拼接给new出来的employee从…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
