小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

gin RouterGroup 方法概览

# Gin,gin 额外说明

收录于:17天前

路由组
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. 使用方法定义

使用 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")
. . .

相关推荐

额外说明

springMVC中@InitBinder的使用

目录 一、@InitBinder的作用 二、数据绑定器 三、全局数据绑定器 3.1. 方式一:@ControllerAdvice 3.2. 方式二:RequestMappingHandlerAdapter 四、自定义数据校验器 五、参数类型转换器 一、@

额外说明

rabbitmq学习(三)——工作队列工作队列的轮询

一、出现背景 在我的前一篇博客中,我们简单说明了simple queue 简单队列的发送和接受操作,但总体看代码和流程,我们会发现存在很多不足。 简单队列存在的不足: 耦合性过高。 1、生产者和消费者必须保证一一对应,如果需要实现多个消费者共同消费同一个

额外说明

sass的一些用法

嵌套选择器 允许将一套css样式嵌套到另一套样式中,内层的样式将它外层的样式当做父选择器 HTML <div><p>Hello scss</p></div> scss div {     p {         color: red     } } 编译

额外说明

平台工作原理

平台总线体系的工作流程: 1.1 第一步:系统启动时在bus系统中注册platform 1.2 第二步:内核移植的人负责提供platform_device 1.3 第三步: 写驱动的人负责提供platform_driver 1.4 第四步:platfor

额外说明

kibana中模糊查询

这里的 * 表示匹配多个字符。这种方式在 KQL 中也被支持。 有的查询KQL做不到,要用lucene通配符的方式  比如 以使用如下的方式来进行模糊查询。通常使用于我们不知道具体需要搜索的文字是什么,或者是因为我们错误地输入一些词: 这里的 ~1 代表

额外说明

display:footer 求和

<display:table varTotals="sumMap" name="sessionScope.someList" id="a"> <display:column property="a_rowNum"/> <display:column pr

额外说明

Java实现:常胜将军问题

Java实现:常胜将军问题 文章目录 Java实现:常胜将军问题 1. 问题 2. 解决方案 3. 实现代码 4. 执行结果 5. 解决方法说明——穷举法 1. 问题 常胜将军问题:现有 21 根火柴,两人轮流取,每人每次可以取走 1 至 4 根,不可多

额外说明

一个小的知识点 —— Java 静态导入

文章目录 介绍 导入类 导入静态方法和静态域 一个小的知识点 —— Java 静态导入 介绍 什么是静态导入? 就是可以导入静态方法和静态域的功能。 导入类 说到 Java 可以导入类,大家一定不陌生,举个例子: import java.util.Sca

额外说明

百度echart绘制圆环

一、代码封装 var pie = function (options) { var option = { backgroundColor: "#fff", //不显示标题 title: {

额外说明

xml中大于等于、小于等于解析错误

第一种写法: 原符号 < <= > >= & ' " 替换符号 < <= > >= & ' " 例如:sql如下: create_date_time >= #{ startTime} and create_date_time <= #{ endTime

ads via 小工具