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")
}
二. 中间件
中间件就是在Router
到Controller
之间可以执行的代码,可以给单个路由添加,也可以路由组添加,也可以全局添加。
2.1 Default or New
在我们创建路由的时候,是gin.Default()
,即包含了:Logger
和Recover
这两个中间件。
如果不需要使用者两个中间件可以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")
}
相关文章:

Gin学习记录4——Controller和中间件
一. Controller 用不同的Controller可以实现业务的分类,不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装,直接将ctrl的代码写入到一个文件里然后调用: package adminimport ("net/http""git…...

FL Studio21.2中文版数字音乐制作软件
现在的FL也可以像splice一样啦,需要什么样的声音只需在fl里搜索,就会自动展示给你! FL Studio 简称FL,全称:Fruity Loops Studio,国人习惯叫它"水果"。软件现有版本是 FL Studio 21,已全面升级支…...

ELK 企业级日志分析系统 ELFK
目录 一、概述 二、组件介绍 2.1、ElasticSearch 2.2、Kiabana 2.3、Logstash 2.4、可以添加的其它组件:Filebeat 2.5、缓存/消息队列(redis、kafka、RabbitMQ等) 2.6、Fluentd 三、ELK工作原理 四、实例演示 1.ELK之 部署"E&q…...

IDEA中创建Java Web项目方法1
以下过程使用IntelliJ IDEA 2021.3 一、File-> New -> Project... 1. 项目类型中选择 Java Enterprise 项目 2. Name:填写自己的项目名称 3. Project template:选择项目的模板,Web application。支持JSP和Servlet的项目 4. Applica…...

源码:TMS FlexCel Studio for .NET 7.19
TMS FlexCel Studio for .NET 是100% 托管代码 Excel 文件操作引擎以及 Excel 和 PDF 报告生成,适用于 .NET、Xamarin.iOS、Xamarin.Android、Xamarin.Mac、Windows Phone 和 Windows Store 功能概述 使用 FlexCel Studio for .NET 创建可动态快速读写 Excel 文件的…...

多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出
多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出 目录 多输入多输出 | MATLAB实现PSO-BP粒子群优化BP神经网络多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现PSO-BP粒子群优化BP神经网络多输入多输出预测 1.data为数据…...

操作系统:系统引导以及虚拟机
1.操作系统引导的过程 ①CPU从一个特定主存地址开始取指令,执行ROM中的引导程序(先进行硬件自检,再开机)②将磁盘的第一块:主引导记录读入内存,执行磁盘引导程序,扫描分区表③从活动分区(又称主…...

AIGC绘本——海马搬家来喽
随着ChatGPT的快速发展,人工智能领域也发生了翻天覆地的变化。今天,我们迎合科技潮流,利用AIGC的强大能力,可以创作很多精彩的作品,比如这样一本名为《海马搬家》的绘本(注:此绘本根据同名儿童故…...

strtok()函数的使用方法
strtok() 函数用于将字符串分割成子字符串(标记)。它在 C 语言中非常常用,可以通过指定分隔符来拆分原始字符串,并依次返回每个子字符串。 以下是 strtok() 函数的使用方法: #include <stdio.h> #include <…...
Matlab中的handle 类
目录 说明 类属性 方法 公共方法 事件 示例 从 handle 派生类 说明 handle 类是遵守句柄语义的所有类的超类。句柄是引用 handle 类的对象的变量。多个变量可以引用同一个对象。 handle 类是抽象类,这样无法直接创建该类的实例。使用 handle 类派…...

C#,数值计算——Multinormaldev的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Multinormaldev : Ran { public Cholesky chol { get; set; } null; private int mm { get; set; } private double[] mean { get; set; } private double[,] xvar {…...

软件项目测试用例评审
软件项目测试用例评审是确保测试计划的一部分(即测试用例)满足项目质量和要求的关键步骤之一。以下是一个通用的软件项目测试用例评审流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎…...
图像处理与计算机视觉--第二章-成像与图像表示-8问
图像处理与计算机视觉--第二章-成像与图像表示-8问 1.光谱波长分布及其成像特点各是什么? 光谱波长分布:是指在不同波长范围内的光的强度或能量分布。它通常可以用光谱图来表示,其中横轴是波长,纵轴是光的强度或能量。 成像特点…...
python中使用多线程批量导入包
问题放到前面,目前发现一个问题,importlib对于c/c编译过来的包,只支持导入最顶层的包,不过也够了。 因为有些项目的依赖太多,所以导致每个文件头部都包含大量import语句,用来导入必要的包,如果量…...

齿轮减速机设备类网站pbootcms模板(PC端+手机端自适应)
齿轮减速机设备类网站pbootcms模板-手机端自适应,优化SEO效果 模板介绍: 这是一款基于PbootCMS内核开发的模板,专为机械设备和加工机械类企业设计。该模板具有简洁简单的页面设计,易于管理,同时还附带测试数据。通过使…...

MySQL报错:this is incompatible with sql_mode=only_full_group_by 解决方法
文章目录 项目场景:原因分析及解决方案:总结: 项目场景: 提示:这里简述项目相关背景: which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_f…...

impala常用时间函数,date->string->timestamp互转
impala 和hive不一样,hive是弱类型,比如int和string在大部分条件下可以比较 比如hive select 11 --结果true或false 但是impala select 11 报错 operands of type TINYINT and STRING are not comparable: 1 1 这样带来的好处是 类型一致结果更…...

无源供电无线测温系统的应用意义
电力系统设备在长期的运行中,往往会产生老化或过热现象,如果没有及时发现和解决,可能会造成严重的火灾事故。由于变电站设备地理位置偏远,对于其维护和监控,管理人员不能做到面面俱到,巡检和维护的难度较大…...

使用 PyTorch 的计算机视觉简介 (1/6)
一、说明 Computer Vision(CV)是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗,到更复杂的任务,例如用自然语言描述图像。 二、CV常见的问…...

用PHP实现极验验证功能
极验验证是一种防机器人的验证机制,可以通过图像识别等方式来判断用户是否为真实用户。在实现极验验证功能时,您需要进行以下步骤: 1 注册极验账号: 首先,您需要在极验官网注册账号并创建一个应用,获取相应…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...