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

gin RouterGroup 方法概览

# Gin,gin 额外说明

收录于:157天前

路由组
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")
. . .

相关推荐

额外说明

常见的几种排序方式

常见的几种排序方式 1. 排序的概念 2. 常见排序算法的实现 2.1 插入排序 2.1.1基本思想 2.1.2 直接插入排序 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2.1基本思想 2.2.2 直接选择排序: 2.2.3 堆排序

额外说明

Unityd3d:用jenkins 自动构建Unity-android打包成apk

jenkins+unity+android的文章参考http://www.cnblogs.com/yinghuochong/archive/2013/09/01/3294940.html 遇到问题:unity.exe 运行总是返回1.我觉得应该是就没有启

额外说明

conda配置清华镜像

转载 https://tools-platform-guide.readthedocs.io/zh_CN/latest/anaconda/%E9%85%8D%E7%BD%AE%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%

额外说明

Python数据结构与算法(4.1)——递归

Python数据结构与算法(4.1)——递归 0. 学习目标 1 递归 1.1 递归的基本概念 1.2 递归的重要性 1.3 递归三原则 1.4 递归的应用 2 递归示例 2.1 列表求和 2.2 汉诺塔(Towers of Hanoi)问题 0. 学习

额外说明

利用R和Octave求解线性方程组

方法一、采用R (1)利用行列式来计算 (2)利用矩阵来计算

额外说明

IntelliJ IDEA 设置添加类与方法时注释

IntelliJ IDEA 设置添加类与方法时注释(作者信息和日期时间等 1.设置类注释方式如下图,参考注释: /** * @ClassName : ${NAME} //类名 * @Author: Mr huang * @Date: ${YEAR}/${

额外说明

Gin中间件的详解 ,用Jwt-go 和 Gin 的安全的登陆的中间件

学习目标: Gin 在不同的group 设置不同的中间件或者过滤器 Gin 的group下的路由上中间件或过滤器 用Jwt-go 和 Gin 的安全的登陆的中间件 JWT 类,它基本有所有基本功能,包括:GenerateToken,GenerateRef

额外说明

ROS从入门到精通1-3:ROS运行管理与常用配置文件

目录 0 专栏介绍 1 xml文件概述 2 yaml文件概述 3 启动文件launch 4 参数服务器 4.1 ROS参数模型 4.2 参数设置实现 4.3 动态参数绑定 5 日志系统 6 数据保存与回放 7 常用内置API 0 专栏介绍 本专栏旨在通过

额外说明

SpringMVC访问不到静态资源的几种解决方法!

解决方法1:在web.xml中进行配置,不需要拦截的都需要配置一下 <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.

ads via 小工具