Gin学习记录4——Controller和中间件

一. Controller

用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件

1.1 单文件Controller

几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用:

package adminimport ("net/http""github.com/gin-gonic/gin"
)func Index(ctx *gin.Context) {ctx.String(http.StatusOK, "首页")
}

调用:

package mainimport ("kanna-web/controller/admin""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/", admin.Index)r.Run(":80")
}

1.2 Controller类与继承

这个和类的写法也是一样的:

package adminimport ("net/http""github.com/gin-gonic/gin"
)type UserController struct {
}type AdminController struct {UserController
}func (c AdminController) Index(ctx *gin.Context) {ctx.String(http.StatusOK, "首页")
}func (c AdminController) Page(ctx *gin.Context) {ctx.String(http.StatusOK, "Page")
}

调用:

package mainimport ("kanna-web/controller/admin""github.com/gin-gonic/gin"
)func main() {r := gin.Default()r.GET("/", admin.AdminController{}.Index)r.GET("/page/", admin.AdminController{}.Page)r.Run(":80")
}

二. 中间件

中间件就是在RouterController之间可以执行的代码,可以给单个路由添加,也可以路由组添加,也可以全局添加。

2.1 Default or New

在我们创建路由的时候,是gin.Default(),即包含了:LoggerRecover这两个中间件。
如果不需要使用者两个中间件可以gin.New()
中间件可以拿来鉴权等各种功能。

2.2 中间件的使用

最基本的形式:

func baseMid(ctx *gin.Context) {fmt.Println("我进入了中间件")
}func main() {r := gin.Default()r.GET("/", baseMid, admin.AdminController{}.Index)r.Run(":80")
}

在这里插入图片描述
路由组:

func main() {r := gin.Default()v1 := r.Group("/v1", baseMid){v1.GET("/login", func(ctx *gin.Context) {ctx.String(http.StatusOK, "Success")})}r.Run(":80")
}
// or v1.Use(baseMid)

全局:

func main() {r := gin.Default()r.Use(baseMid)v1 := r.Group("/v1"){v1.GET("/login", func(ctx *gin.Context) {ctx.String(http.StatusOK, "Success")})}r.Run(":80")
}

2.3 Next()和Abort()

Next()可以先执行Control的内容,再返回到Next()处:

func baseMid(ctx *gin.Context) {fmt.Println("我进入了")ctx.Next()fmt.Println("我离开了")
}func main() {r := gin.Default()r.Use(baseMid)r.GET("/", func(ctx *gin.Context) {fmt.Println("我显示了")ctx.String(http.StatusOK, "Success")})r.Run(":80")
}

在这里插入图片描述
Abort()可以结束Controller的行为:

func baseMid(ctx *gin.Context) {fmt.Println("我进入了")ctx.Abort()fmt.Println("我离开了")
}func main() {r := gin.Default()r.Use(baseMid)r.GET("/", func(ctx *gin.Context) {fmt.Println("我显示了")ctx.String(http.StatusOK, "Success")})r.Run(":80")
}

在这里插入图片描述
在这里插入图片描述

2.4 多中间件顺序

func Mid1(ctx *gin.Context) {fmt.Println("中间件1进入")ctx.Next()fmt.Println("中间件1离开")
}func Mid2(ctx *gin.Context) {fmt.Println("中间件2进入")ctx.Next()fmt.Println("中间件2离开")
}func main() {r := gin.Default()r.Use(Mid1, Mid2)r.GET("/", func(ctx *gin.Context) {fmt.Println("我显示了")ctx.String(http.StatusOK, "Success")})r.Run(":80")
}
/*
中间件1进入
中间件2进入
我显示了
中间件2离开
中间件1离开
*/
func Mid1(ctx *gin.Context) {fmt.Println("中间件1进入")ctx.Abort()fmt.Println("中间件1离开")
}func Mid2(ctx *gin.Context) {fmt.Println("中间件2进入")ctx.Next()fmt.Println("中间件2离开")
}func main() {r := gin.Default()r.Use(Mid1, Mid2)r.GET("/", func(ctx *gin.Context) {fmt.Println("我显示了")ctx.String(http.StatusOK, "Success")})r.Run(":80")
}
/*
中间件1进入
中间件1离开
*/

2.5 中间件与Control共享数据

可以用set*get*等函数,例如:

func Mid1(ctx *gin.Context) {ctx.Set("uid", "kanna")
}func main() {r := gin.Default()r.Use(Mid1)r.GET("/", func(ctx *gin.Context) {uid := ctx.GetString("uid")ctx.String(http.StatusOK, uid)})r.Run(":80")
}

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

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

相关文章

windows进程管理相关命令

windows进程管理相关命令 根据进程名找到进程 例如python进程 PS C:\Users\27467> tasklist | findstr python python.exe 7088 Console 2 3,364 K python.exe 1580 Console 2 41,…

深度学习自学笔记三:向量化逻辑回归和Python中的广播

目录 一、向量化 二:向量化逻辑回归 三、Python中的广播 一、向量化 向量化(Vectorization)是一种优化技术,可以在机器学习和数值计算中加快代码的执行速度。它的核心思想是使用矩阵和向量运算,而不是显式地循环处…

Spring的RestTemplate学习

Spring提供了一个RestTemplate模板工具类,对基于Http的客户端进行了封装,并且实现了对象与json的序列化和反序列化,非常方便。RestTemplate并没有限定Http的客户端类型,而是进行了抽象,目前常用的3种都有支持&#xff…

数据结构与算法(六)--链表的遍历,查询和修改,删除操作

一、前言 上篇文章我们了解了链表的概念以及链表底层的搭建以及向链表中添加元素的操作。本次我们继续学习链表剩余的操作:遍历,查询和修改、删除操作。 二、链表查询以及遍历 ①获得链表的第index(0-based)个位置的元素(不常用&#xff0…

1447: PIPI的线性表问题Ⅰ

题目描述 已知线性表中的元素以递增序列排列,并以单链表作存储结构。设计算法删除表中所有值相同的多余元素(使得操作后的线性表中所有的值均不相同),同时释放被删结点空间,并分析算法的时间复杂度。 输入 第一行输…

云计算介绍

1.1 SaaS SaaS 是 Software-as-a-Service(软件即服务)1.2 PaaS PaaS 是 Platform-as-a-Service 的缩写,意思是平台即服务。 把服务器平台作为一种服务提供的 商业模式。通过网络进行程序提供的服务称之为 SaaS(Software as a Serv…

2023年海南省职业院校技能大赛(高职组)“软件测试”赛项竞赛规程

2023年海南省职业院校技能大赛(高职组) “软件测试”赛项竞赛规程 一、赛项名称 赛项名称:软件测试 英文名称:Software Testing 赛项组别:高职组 赛项归属产业:电子信息大类 二、竞赛目标 &#xf…

MySQL详细案例 1:MySQL主从复制与读写分离

文章目录 1. MySQL主从复制1.1 使用场景1.2 MySQL的复制类型1.3 主从复制的作用1.4 主从复制的工作过程1.5 实现MySQL主从复制1.5.1 前置准备1.5.2 主服务器mysql配置1.5.3 从服务器1 mysql配置1.5.4 从服务器2 mysql配置1.5.5 测试 1.6 主从复制的3种同步模式1.6.1 异步复制&a…

微信小程序底部安全区域高度获取

CSS 属性 safe-area-inset-bottom safe-area-inset-bottom 就是安全区的高度 padding-bottom:env(safe-area-inset-bottom); wx.getSystemInfoSync() wx.getSystemInfoSync()可以获取系统信息 let system wx.getSystemInfoSync() let bottomSafe system.screenHeight -…

一招解除csdn复制限制

先看这个代码 python读取英文pdf翻译成中文pdf文件导出代码 想要复制代码,csdn有限制怎么办(csdn流氓,无耻) 解除方法 ctrlu 看效果

Linux启动过程详解 Xmind导图笔记

参考大佬博客: 简要描述linux系统从开机到登陆界面的启动过程 Linux启动过程详解 Bootloader详解 来源:从BIOS开始画图了解Linux启动过程——老杨Linux

OpenCV自学笔记二十六:人脸检测

目录 一、人脸检测 二、LBPH人脸识别 三、EigenFaces人脸识别 四、Fisherfaces人脸识别 一、人脸检测 在OpenCV中,人脸检测是一个常见的计算机视觉任务,可以通过Haar级联分类器来实现。Haar级联分类器是一种基于机器学习的目标检测方法,…

TSINGSEE视频AI智能分析技术:水泥厂安全生产智能监管解决方案

一、方案背景 随着人工智能技术的快速发展以及视频监控系统在全国范围内的迅速推进,基于AI视频智能分析技术的智能视频监控与智慧监管系统,也已经成为当前行业的发展趋势。在工业制造与工业生产领域,工厂对设备的巡检管理、维护维修、资产管…

【全志V3s】SPI NAND Flash 驱动开发

文章目录 一、硬件介绍V3s的启动顺序 二、驱动支持U-Boot驱动主线 Linux 驱动已经支持 三、烧录工具 xfel四、构建U-Boot(官方的Uboot)先编译一下开始spi nand flash 代码层面的适配修改menuconfig配置ARM architecture配置Support for SPI Nand Flash o…

前端大批量并发请求的处理

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>测试大批量并发异步请求</title> </…

关于线程池

线程池是一种多线程处理方式&#xff0c;通过将任务添加到队列中&#xff0c;在创建线程后自动启动这些任务。线程池中的线程可以复用&#xff0c;可以控制最大并发数&#xff0c;并且方便管理&#xff0c;也就是说&#xff0c;线程池会提前创建好一些线程&#xff0c;当后续需…

rabbitMQ (1)

文章目录 1. RabbitMQ 介绍1.1 几个重要概念1.2 RabbitMq 的工作原理 2 RabbitMQ 安装3. RabbitMQ 入门操作3.1 添加依赖3.2 生产者代码3.3 消费者代码 4. Work Queues5. 管理端页面创建队列 1. RabbitMQ 介绍 引用 &#xff1a; RabbitMQ 是一个消息中间件&#xff1a;它接受…

Xilinx FPGA 程序固化重新上电程序不运行的问题

问题描述 FPGA直接下载bit文件,功能正常。 FPGA擦除FLASH,烧写FLASH,正常。 电源断电,重新上电,FALSH里面的程序没有启动,FPGA程序没有跑起来。–FLASH启动不正常。 解决办法 在XDC约束文件里边增加约束: ## Configuration options, can be used for all designs se…

JsonPath详解

JsonPath 简介 JsonPath是一种信息抽取类库&#xff0c;是从JSON文档中抽取指定信息的工具文档 http://goessner.net/articles/JsonPath 安装 pip install jsonpath 使用 注意&#xff1a;这里的json_data为python数据&#xff0c;如列表&#xff0c;字典 data jsonpath.…

[Linux入门]---Linux项目自动化构建工具-make/Makefile

目录 1.背景2.make指令输入make默认为Makefile文件第一条指令执行Makefile文件对gcc指令特殊处理及原理特殊符号 3.总结 1.背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放…