Gin框架入门(四)—中间件

文档

官方文档:https://godoc.org/github.com/gin-gonic/gin
官方地址:https://github.com/gin-gonic/gin
中间件:https://gin-gonic.com/zh-cn/docs/examples/using-middleware

无中间件

func main() {//创建一个无中间件路由r := gin.New()r.Run()
}

默认中间件

func main() {// 默认启动方式,包含 Logger、Recovery 中间件r := gin.Default()r.GET("/", func(c *gin.Context) {c.JSON(200, gin.H{"middleware": "默认中间件",})})r.Run()
}

自定义中间件

func CustomRouterMiddle1(c *gin.Context) {t := time.Now()fmt.Println("start---我是自定义中间件第1种定义方式---请求之前")//在gin上下文中定义一个变量c.Set("example", "CustomRouterMiddle1")//请求之前c.Next()fmt.Println("end---我是自定义中间件第1种定义方式---请求之后")//请求之后,计算整个请求过程耗时t2 := time.Since(t)log.Println(t2)
}func CustomRouterMiddle2() gin.HandlerFunc {return func(c *gin.Context) {t := time.Now()fmt.Println("start---我是自定义中间件第2种定义方式---请求之前")// 在gin上下文中设置 example 变量c.Set("example", "CustomRouterMiddle2")// 请求前c.Next()fmt.Println("end---我是自定义中间件第2种定义方式---请求之后")// 请求后t2 := time.Since(t)log.Print(t2)}
}
//自定义中间件
func mian() {r := gin.New()r.Use(CustomRouterMiddle1)//r.Use(CustomRouterMiddle2())r.GET("/test", func(c *gin.Context) {example := c.MustGet("example").(string)log.Println(example)})r.Run()
}

路由中间件

func RouterMiddle1(c *gin.Context) {c.String(http.StatusOK, "我是路由中间件1\n")
}func RouterMiddle2(c *gin.Context) {c.String(http.StatusOK, "我是路由中间件2\n")
}func RouterMiddleHandle() gin.HandlerFunc {return func(c *gin.Context) {c.String(http.StatusOK, "我是业务处理函数\n")}
}func main() {r := gin.New()//单个路由的中间件是可以添加多个的,并按照添加的函数顺序执行的r.GET("/testRouteMiddle", RouterMiddle1, RouterMiddle2, RouterMiddleHandle())r.Run()
}

在这里插入图片描述

从上图可以看出单个路由的中间件是可以添加多个的,并按照添加的函数顺序执行的。

路由组中间件

func GroupRouterMiddle1(c *gin.Context) {c.String(http.StatusOK, "我是路由组中间件1\n")
}func GroupRouterMiddle2(c *gin.Context) {c.String(http.StatusOK, "我是路由组中间件2\n")
}func main() {r := gin.New()articleGroup := r.Group("/article")articleGroup.Use(GroupRouterMiddle1, GroupRouterMiddle2){articleGroup.GET("/add", func(c *gin.Context) {c.String(http.StatusOK, "/article/add")})articleGroup.GET("/del", func(c *gin.Context) {c.String(http.StatusOK, "/article/del")})//articleGroup下再嵌套一个testGrouptestGroup := articleGroup.Group("/test", func(c *gin.Context) {c.String(http.StatusOK, "article/test下的中间件\n")})testGroup.GET("/test1", func(c *gin.Context) {c.String(http.StatusOK, "article/test/test1的函数")})}r.Run()
}

填写正确的路由组和路由,中间件先执行,并按照传入函数的顺序执行。
在这里插入图片描述
填写正确的路由组,错误的路由,中间件不执行,并返回404错误
在这里插入图片描述

全局中间件

func GlobalMiddle(c *gin.Context) {c.String(http.StatusOK, "我是全局中间件\n")
}func main() {r := gin.New()//使用自定义的全局中间件r.Use(GlobalMiddle)r.GET("/testRouteMiddle", func(c *gin.Context) {c.String(http.StatusOK, "业务函数")})r.Run()
}

在这里插入图片描述

自定义中间件的执行顺序:全局中间件 > 路由组中间件 > 路由中间件

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

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

相关文章

前端用a标签实现静态资源文件(excel/word/pdf)下载

接上文实现的 前端实现将二进制文件流,并下载为excel文件后, 实际项目中一般都会有一个模版下载的功能,一般都由服务端提供一个下载接口,返回文件流或url地址,然后前端再处理成对应需要的类型的文件。 但是&#xff…

本地CPU搭建知识库大模型来体验学习Prompt Engineering/RAG/Agent/Text2sql

目录 1.环境 2.效果 3.概念解析 4.架构图 5. AI畅想 6.涉及到的技术方案 7. db-gpt的提示词 1.环境 基于一台16c 32G的纯CPU的机器来搭建 纯docker 打造 2.效果 3.概念解析 Prompt Engineering : 提示词工程 RAG: 检索增强生成; …

【源码】IM即时通讯源码/H5聊天软件/视频通话+语音通话/带文字部署教程

【源码介绍】 IM即时通讯源码/H5聊天软件/视频通话语音通话/带文字部署教程 【源码说明】 测试环境:Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6,根目录public,伪静态laravel5,根据情况开启SSL 登录后台看到很熟悉。。原来是…

el-table-column 表格列自适应宽度的组件封装说明

针对组件业务上的需求,需要给 el-table-column 加上限制,需保证表头在一行展示,部分列的内容要一行展示,自适应单项列的宽度; 1、先计算数据渲染后的 el-table-column 文本宽度; 因列表的有些数据需要做到…

如此建立网络根文件系统 Mount NFS RootFS

安静NFS系统服务 sudo apt-get install nfs-kernel-server 创建目录 sudo mkdir /rootfsLee 将buildroot编译的根文件系统解压缩到 sudo tar xvf rootfs.tar -C /rootfsLee/ 添加文件NFS访问路径 sudo vi /etc/exports sudo /etc/exports文件,添加如下一行 …

网站推荐——文本对比工具

在线文字对比工具-BeJSON.com 文本对比/字符串差异比较 - 在线工具 在线文本对比-文本内容差异比较-校对专用

企业智能名片小程序:AI智能跟进功能助力精准营销新篇章

在数字化浪潮的推动下,企业营销手段不断迭代升级。如今,一款集手机号授权自动获取、智能提醒、访客AI智能跟进及客户画像与行为记录于一体的企业智能名片小程序,正以其强大的AI智能跟进功能,助力企业开启精准营销的新篇章。 通过深…

图像处理到神经网络:线性代数的跨领域应用探索

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Swift 中的 Range 运算符

在 Swift 中,Range 运算符是一种强大的工具,用于表示一系列连续的数值或字符。Range 可以用于循环、数组切片、条件语句等场景,为我们提供了方便的方法来处理数据集合。 闭区间运算符 a...b 闭区间运算符 a...b 用于创建一个从起始值到结束…

无监督学习的评价指标

轮廓系数(Silhouette Coefficient) 轮廓系数用于判断聚类结果的紧密度和分离度。轮廓系数综合了样本与其所属簇内的相似度以及最近的其他簇间的不相似度。 其计算方法如下: 1、计算簇中的每个样本i 1.计算a(i) &#x…

百度SDK创建应用地址解析失败问题

在百度SDK的设置里先用IP白名单校验全部都通过,项目上线之后再改就行 0.0.0.0/0

【Leetcode每日一题】 分治 - 面试题 17.14. 最小K个数(难度⭐⭐)(66)

1. 题目解析 题目链接:面试题 17.14. 最小K个数 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 在快速排序算法中,我们通常会通过选择一个基准元素,然后将数组划分为三个部分&…

通过Cmake官网下载.gz文件安装最新版本的CMAKE、适用于debian

1.前往官网下载最新版本debian https://cmake.org/download/ 2.选他 3. 通过XFTP传输到服务器 4. 解压文件 #cd 进入对应目录,然后执行下面命令解压 $ tar -zxvf cmake-3.29.2.tar.gz5.执行这个文件 $ ./bootstrap6.完成之后再执行这个 $ make7.然后&#xff…

C++面经(简洁版)

1. 谈谈C和C的认识 C在C的基础上添加类,C是一种结构化语言,它的重点在于数据结构和算法。C语言的设计首要考虑的是如何通过一个过程,对输入进行运算处理得到输出,而对C,首先要考虑的是如何构造一个对象,通…

人工智能|推荐系统——推荐大模型最新进展

近年来,大语言模型的兴起为推荐系统的发展带来了新的机遇。这些模型以其强大的自然语言处理能力和丰富的知识表示,为理解和生成复杂的用户-物品交互提供了新的视角。本篇文章介绍了当前利用大型语言模型进行推荐系统研究的几个关键方向,包括嵌入空间的解释性、个性化推荐的知…

Amazon云计算AWS之[5]关系数据库服务RDS

文章目录 RDS的基本原理主从备份和下读写分离 RDS的使用 RDS的基本原理 Amazon RDS(Amazon Relational Database Service) 将MySQL数据库移植到集群中,在一定的范围内解决了关系数据库的可扩展性问题。 MySQL集群方式采用Share-Nothing架构。每台数据库服务器都是…

【C++】---STL容器适配器之stack

【C】---STL容器适配器之stack 一、什么是适配器?二、栈1、栈的性质2、栈类(1)栈的构造(2)empty()(3)push()(4)pop()(5)top()(6&#…

yolov8 dll 编译

1. 每次用yolo v8 都要用python ,对于我这种写软件的太不方便了,下面尝试编译dll 调用, 我已经有做好的模型.best.pt 参考视频方法: yolov8 TensorRT C 部署_哔哩哔哩_bilibili 【yolov8】tensorrt部署保姆级教程,c版_哔哩哔哩_bilibili 需…

面经总结(二)(数据库)

数据库常识: 1、数据库系统包含什么? 包含了数据库、数据库管理系统、数据库管理员和应用程序。 数据库(DB):顾名思义是存放数据的仓库,实现数据的持久化。 数据库管理系统(DBMS):类似于操作系…

rabbitmq下载安装最新版本--并添加开机启动图文详解!!

一、简介 RabbitMQ是一个开源的遵循AMQP协议实现的消息中间件支持多种客户端语言,用于分布式系统中存储和转发消息, 这是 Release RabbitMQ 3.13.0 rabbitmq/rabbitmq-server GitHub 二、安装前准备 1、查看自己系统 确认操作系统版本兼容性 uname -a2、下载Erlang依赖包…