gin RouterGroup 方法概览

news2024/11/24 11:51:39

路由组
RouterGroup是gin 里面的路由组,主要作用是实现gin的路由。

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

RouterGroup是嵌套在了Engine内部,实际上调用Engine的get,post等方式就是RouterGroup的实现。

另外RouterGroup还实现了如下两个接口:
在这里插入图片描述
在这里插入图片描述

Engine相当于RouterGroup的子类。

RouterGroup对象实现了两个接口分别是路由相关的方法,另外还有Use方法用于定义新的路由和中间件。

RouterGroup嵌套在Engine中,因此通过Engine也可以直接调用路由方法。

路由可以通过 r := gin.Default() 返回的对象来定义,这个方法会返回框架实例,而框架实例,也就是 gin.Engine 的实例,嵌套了 RouterGroup 结构体,因此可以直接通过 r 来定义路由,比如:

r.GET("/test", func(c *gin.Context) {
    c.String(200, "Hello world!")
})
//创建一个服务器引擎
engine := gin.Default()
//配置web容器地址
engine.GET("/")

//定义路由组对象
group := gin.RouterGroup{}
group.GET("/test")
//配置服务器端口
engine.Run(":8080")

两种调用方式是等价的。

中间件

中间件是路由的前置函数,在路由点之前执行函数。

在这里插入图片描述
如上图所示,路由的前置函数可以由很多个,满足返回值类型为gin.HandlerFunc且参数是gin.Context就是中间件。

在这里插入图片描述

gin.HandlerFunc是返回值为gin.Context的方法类型。

中间可以直接放在路由之后,也可以通过Use方法注册。

  1. 路由处理函数的顺序定义中间件
//定义权限认证中间件

func Certification() gin.HandlerFunc {
	return func(context *gin.Context) {
		context.Set("username", "xiaoxu")
		if context.PostForm("username") != "xiaoxu" {
			context.String(200, "用户名错误!")
			context.Abort()
		} else {
			context.Next()
		}
	}
}


//gin的路由调用拦截器

import "github.com/gin-gonic/gin"

func main() {

	engine := gin.Default()
	engine.GET("/", Certification(), func(context *gin.Context) {
		context.String(200, "Hello World")
	})

	engine.GET("/index", Certification(), func(context *gin.Context) {
		context.String(200, "welcome index !")
	})

	engine.GET("/test", Certification(), func(context *gin.Context) {
		context.String(200, "welcome test")
	})
	engine.Run("127.0.0.1:80")
}

  1. Use方法定义

使用 engine.Use() 的时候,定义的中间件是对所有请求都有效的。
使用 g := r.Group(“/user”); g.Use() 的时候,定义的中间件只对 /user 路由分组有效。

//配置web容器地址
get := engine.GET("/")
get.Use(Hello())
func Hello() gin.HandlerFunc {
	return func(context *gin.Context) {
		context.String(200, "hello")
	}
}

对每个路由注册中间件是很繁琐的,而且代码都是一样的,可以通过路由组实现。

// /user 路由分组
group := gin.RouterGroup{}
v1 := group.Group("/v1")
{
	v1.POST("/login", loginEndpoint)
	v1.POST("/submit", submitEndpoint)
	v1.POST("/read", readEndpoint)
}
group.Use(Hello())

在这里插入图片描述

项目分层

在实际项目中不可能所有的路由都在一个包下,要进行项目的分层。

在这里插入图片描述

控制器仅仅其路由作用,负责调用逻辑层的API。

// 首页
type IndexController struct{}

var indexLogic logic.IndexLogic

func (self IndexController) RegisterRoute(g gin.RouterGroup) {
	g.GET("/index", self.getNotice)
}

func (IndexController) getNotice(c *gin.Context) {
	notic := indexLogic.GetNotic()
	param.SucRes(notic)
}

那么服务器就不在是简单的启动方式了

engine := gin.Default()
//路由
/**
...
**/
//配置服务器端口
engine.Run(":8080")

但是在原理上还是未变化的,最后都需要使用Engine的实例来启动。

但是在各个个控制器中一般传递了gin.RouterGroup或者gin.Engine两个都可以使用路由方法,因为前者是嵌套在后者中的。

不论创建那个的实例都是一样的,若是RouterGroup的实例,则需要载创建Engine的是并实现嵌套赋值,若是Engine实例直接调用监听方法即可。

//RouterGroup作为参数构建路由
//创建一个服务器引擎
engine := gin.Default()
//配置RouterGroup
router := gin.RouterGroup{}

c := new(controller.IndexController)
c.RegisterRoute(&router)

//RouterGroup赋值
engine.RouterGroup = router

//配置服务器端口
engine.Run("127.0.0.1:8080")

启动服务器必须使用Engine,所以RouterGroup作为参数是需要内嵌Engine。

如果路由直接使用Engine的话,就可以省略RouterGroup赋值那步。

//gin.Engine做参数
type IndexController struct{}

func (self IndexController) RegisterRoute(g *gin.Engine) {
	g.GET("/index", self.getNotice)
}

func (IndexController) getNotice(c *gin.Context) {
	lo := logic.IndexLogic{}
	notice := lo.GetNotice()
	fmt.Println(notice)
}


//服务器启动
//创建一个服务器引擎
engine := gin.Default()

//控制器传参
c := new(controller.IndexController)
c.RegisterRoute(engine)

//配置服务器端口
engine.Run("127.0.0.1:8080")

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

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

相关文章

【Shell】自定义传入参数

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…

多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab海洋捕食者算法(MPA)优化极限学习机ELM回归预测,MPA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …

计算机中丢失api-ms-win-core-path-l1-1-0dll

使用python自带工具打包exe文件夹时出现的错误。win10的exe文件放到win7上跑不出来。 本着找到这个dll文件放进去,但同事的win10打包的程序就可以放到win7上运行,所以改了python环境,把虚拟环境python版本改成了3.8,原来用的3.9不…

FFmpeg ~ 安装(附MetaRTC整合)

前言 本文会讲述FFmpeg下载/配置/编译/安装的完整流程,该流程并不复杂,因此本文的重点在于如何整合MetaRTC。MetaRTC的作用是令FFmpeg支持WebRTC推/拉流及回声消除功能(常规版本的FFmpeg是不支持该功能的),使得WebRTC音…

【万字长文】AMD Instinct MI300详细解析:超微半导体的光辉时刻

美国时间6月13日,AMD在美国加利福尼亚州旧金山举行了一场名为“数据中心与AI技术首演”的活动,并在主题演讲中介绍了数据中心的解决方案。 其中,宣布推出“AMD Instinct MI300系列加速器”(以下简称Instinct MI300系列&#xff0…

MidJourney v5.2 、Stable Diffusion XL 0.9 出图对比

最近两个最流行的AI图像生成器,Midjourney和Stable Diffusion,都发布了重大更新。Midjourney v5.2引入了许多新功能,包括“缩小”功能、“/缩短”命令、改进的图像质量等。 Stable Diffusion XL (SDXL) 0.9则专注于改善图像质量和构图。新模…

经典文献阅读之--R-PCC(基于距离图像的点云压缩方法)

0. 简介 对于激光雷达数据而言,虽然与2D图像相比,可以提供精确的物体深度信息,但也存在数据量大的问题,不便于数据存储或传输。在拿到离线数据分析的时候会发现我们很难拿到较长一段时间的激光数据,这就给我们问题的重…

抖音最新版本抓包

1.下载fiddler抓包工具 2.配置https抓包环境 3.抓包工具配置好了之后,我们确保手机和电脑在同一个局域网中 4.打电脑CMD 输入 ipconfig 查看电脑的ip地址 5.打开我们的手机设置代理 6.打开浏览器 输入:你的电脑ip:8888 下载证书 7.打开Re文件管理器(ps…

原来,绩效管理还能这么玩

早上好,我是老原。 最近,有个粉丝朋友来找我请教:他最近加入另外一家大型互联网公司,主要是负责领导力相关这块。他们现在也在做OKR实践,但是碰到了很多问题。 对此我并不觉得意外,因为这样的案例太多了。…

ModaHub魔搭社区:GPTCache的工作原理和为什么选择 GPTCache?

什么是 GPTCache? GPTCache 是一个开源工具,旨在通过实现缓存来提高基于 GPT 的应用程序的效率和速度,以存储语言模型生成的响应。GPTCache 允许用户根据其需求自定义缓存,包括嵌入函数、相似度评估函数、存储位置和驱逐等选项。…

《Opencv3编程入门》学习笔记—第十一章

《Opencv3编程入门》学习笔记 记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。 第十一章 特征检测与匹配 一、SURF特征点检测 太复杂了!全是公式! (一)SURF算法概览 SURF,SpeededUp Rebus…

基于matlab使用点要素匹配在杂乱场景中检测对象(附源码)

一、前言 此示例演示如何在给定对象的参考图像的情况下检测杂乱场景中的特定对象。 此示例提供了一种基于查找参考和目标图像之间的点对应关系来检测特定对象的算法。它可以检测物体,尽管刻度变化或面内旋转。它对少量的面外旋转和遮挡也很鲁棒。这种对象检测方法…

Ansible练习

部署ansible练习 开始之前先使用student用户登录 登录命令:ssh studentworkstation 在workstation上运行lab deploy-review start命令,此脚本将确保受管主机在网络上访问。 然后开始验证控制节点上是否安装了ansible软件包,在运行anisble -…

Shell脚本编程教程

Shell脚本编程 1.Shell脚本语言的基本结构 1.1 Shell脚本的用途: 自动化常用命令执行系统管理和故障排除创建简单的应用程序处理文本或文件 1.2 Shell脚本基本结构: ​ Shell脚本编程:是基于过程式,解释执行的语言 编程语言…

【C#】简单聊下Framework框架下的事务

框架用的多了,之前版本的事务都忘记了。本次简单聊下.net framework 4.8框架下本身的事务 目录 1、SqlClient2、TransactionScope3、引用 1、SqlClient 在 C# 中,使用 using 块可以方便地实现对资源的自动释放,但它不适用于实现事务处理。为…

Redis实践篇(二)优惠卷秒杀 一人一单、分布锁

目录 全局ID生成器​编辑 实现优惠卷下单 优惠卷超卖问题 乐观锁 一人一单 分布式锁 分布锁的实现 基于Redis的分布锁 Redis的Lua脚本 再次改进Redis的分布锁 基于Redis的分布锁优化 Redisson分布式框架 引入依赖 Redisson可重入锁原理 Redisson分布锁原理​编辑 全局I…

基于Hadoop的疫情信息分析与可视化研究——包含大屏可视化及预测算法

需要本项目的全套环境、代码、文档、资源、数据和部署调试的私信博主!!! 本研究基于中国新冠疫情2020-01-11至2022-12-20的全国整体数据进行疫情大数据分析,通过对历史的数据进行大数据分析,可以有效的掌握过去疫情数据…

4、JAVA 嵌套for循环 while do-while

1 嵌套for循环 1.1 概述 存在至少2层for循环,根据外层的条件,判断里层能否执行 如果能执行,就把里层代码都循环完毕后,再继续判断是否执行外层循环的下一次循环 1.2 嵌套for形式 1.3 练习:嵌套for循环入门案例 创建包: cn.tedu…

Jupyter notebook安装运行(详解)

目录 Jupyter notebook 概念 官方文档 特点 使用Anaconda安装 使用pip安装 运行Jupyter Notebook 指定端口启动 Jupyter notebook修改主目录 Jupyter notebook 概念 Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算:开发…

Dlib —— 对图片进行人脸检测(附源码)

效果 代码 Vs2017下使用Dlib检测人脸&#xff0c;并通过OpenCv将结果绘制出来。&#xff08;由于Dlib库已编译好&#xff0c;Vs工程环境自行搭建&#xff0c;OPenCv环境参考本人之前的专栏文章&#xff09; #include <iostream>#include <dlib/image_processing/fron…