gin框架中的中间件
全局中间件
所有请求都经过此中间件
- 中间件中设置值
func MiddleWare() gin.HandlerFunc {
return func(context *gin.Context) {
t := time.Now()
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get获取
context.Set("request", "中间件")
status := context.Writer.Status()
fmt.Println("中间件执行完毕", status)
t2 := time.Since(t)
fmt.Println("time: ", t2)
}
}
- 处理方法中取值
func middleHello(context *gin.Context) {
// 从中间件设置的变量中取值
value, ok := context.Get("request")
if ok {
fmt.Println(value)
}
context.JSON(http.StatusOK, gin.H{"request": value})
}
输出结果:
中间件开始执行了
中间件执行完毕 200
time: 0s
中间件
注意: 请注意黑色的数据里面有一步算时间差没有执行(需要学习Next就懂了)
context.Next()方法
func MiddleWare() gin.HandlerFunc {
return func(context *gin.Context) {
t := time.Now()
fmt.Println("中间件开始执行了")
// 设置变量到Context的key中,可以通过Get获取
context.Set("request", "中间件")
status := context.Writer.Status()
fmt.Println("中间件执行完毕", status)
// 请求前执行
context.Next()
// 请求后执行
t2 := time.Since(t) // 计算函数处理请求时间
fmt.Println("time: ", t2)
}
}
执行结果:
中间件开始执行了
中间件执行完毕 200
中间件
time: 1.014342s
路由组使用中间件
`adminRouterGroup.Use(middleware.MiddleWare())
局部中间件
router.GET("/middle-hello", middleware.MiddleWare(), middleHello)
中间件练习
定义程序计时中间件,然后定义2个路由,执行函数后应该打印统计的执行时间,如下:
- 自定义程序耗时中间件
func MyTime() gin.HandlerFunc {
return func(context *gin.Context) {
startTime := time.Now()
context.Next()
d := time.Since(startTime)
fmt.Println("程序耗时:", d)
}
}
请求两个路由执行结果:
程序耗时: 3.0023744s
[GIN] 2021/12/10 - 10:54:26 | 200 | 3.0029489s | 127.0.0.1 | GET "/admin/shop"
程序耗时: 1.0132144s
[GIN] 2021/12/10 - 10:54:37 | 200 | 1.0132144s | 127.0.0.1 | GET "/middle-hello"
中间件推荐
gin框架中的中间件的更多相关文章
- gin框架中中间件的编写与使用
概念 一个完整的系统可能包括鉴权认证.权限管理.安全检查.日志记录等多维度的系统支持. 中间件位与服务器和实际业务处理程序之间,其含义就相当于在请求和具体的业务处理逻辑之间增加某些操作,这种以额外增加 ...
- 在gin框架中使用JWT
在gin框架中使用JWT JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下. 什么 ...
- golang gin框架中实现一个简单的不是特别精确的秒级限流器
起因 看了两篇关于golang中限流器的帖子: Gin 开发实践:如何实现限流中间件 常用限流策略--漏桶与令牌桶介绍 我照着用,居然没效果-- 时间有限没有深究.这实在是一个很简单的功能,我的需求是 ...
- gin框架中的路由
基本路由 gin框架中采用的路由库是基于httrouter做的 地址为:https://github.com/julienschmidt/httprouter httprouter路由库 点击查看代码 ...
- gin框架中请求路由组的使用
1. gin框架中可以使用路由组来实现对路由的分类 package main import "github.com/gin-gonic/gin" func main() { rou ...
- 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证
本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...
- Gin框架中文文档
Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 带目录请移步 http://xf.shuangdeyu.com/ ...
- 【解决了一个小问题】gin框架中出现如下错误:"[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 500"
POST到数据到一条gin框架的接口后,客户端收到400错误,并且返回了业务中返回的"decode json fail". 关键代码是: func report(c *gin.Co ...
- golang gin框架中实现大文件的流式上传
一般来说,通过c.Request.FormFile()获取文件的时候,所有内容都全部读到了内存.如果是个巨大的文件,则可能内存会爆掉:且,有的时候我们需要一边上传一边处理. 以下的代码实现了大文件流式 ...
随机推荐
- IDEA中springboot项目添加yml格式配置文件
1.先创建application.properties 文件,在resources文件夹,右键 new -> Resource Bundle 如下图所示,填写名称 2.生成如下图所示文件 3. ...
- summernote富文本图片上传,增加视频上传功能、批量上传方法
Summernote 是一个简单灵活的所见即所得的 HTML 在线编辑器,基于 jQuery 和 Bootstrap 构建,支持快捷键操作,提供大量可定制的选项. 但是却只有图片上传功能,没有视频上传 ...
- C++代码优化之nim_duilib控件关联
前言 使用nim_duilib关联控件,优化后.的确减少了代码量,那么,执行效率呢? 时间执行的长短与硬件.软件有关,以下内容仅为参考. 测试代码 下面的代码,分为两部分, 循环使用for,非循环则直 ...
- 【LeetCode】940. Distinct Subsequences II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- 【LeetCode】120. Triangle 解题报告(Python)
[LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...
- opencv学习(六)——图像基本操作
图像基本操作 一.访问和修改像素值 先来理解一下,图像与一般的矩阵或张量有何不同(不考虑图像的格式,元数据等信息).首先,一张图像有自己的属性,宽,高,通道数.其中宽和高是我们肉眼可见的属性,而通道数 ...
- 如何通过Navicat远程访问宝塔面板安装的MySQL数据库
运行环境描述 阿里云ECS 系统:CentOS Linux 7.4.1708 (Core)宝塔面板: 6.9.0数据库:MySQL 5.7.19 Navicat 远程连接 Navicat报错信息: 错 ...
- Java代码实体类生成SQL语句(Java实体类转数据库)
有的时候把数据库删了,如果照着实体类重新创建数据库的话比较麻烦,可以使用这个工具,把代码复制到项目里面设置一下即可把Java代码中的实体类转换为SQL语句输出为一个文件,打开执行命令即可. 下载:ht ...
- JSP中使用<c:forEach>标签循环遍历元素
1.forEach标签元素 <c:forEach items="接收集合对象" var="迭代参数名称" varStatus="迭代状态,可访问 ...
- 编写Java程序,创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck)。
返回本章节 返回作业目录 需求说明: 创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck). 父类有属性品牌(brand)和颜色(color). 在父 ...