gin的控制器与路由

6次阅读

共计 1877 个字符,预计需要花费 5 分钟才能阅读完成。

1. 概述

  • 路由是一个过程,指的是一个 http 请求,如何找到对应的处理器函数(也可以叫控制器函数),Gin 框架的路由是基于 httprouter 包实现的。
  • 控制器是在路由完成了 URL 检测和路由检测之后,路由器会分发请求到对应的路由地址,这也是应用请求的生命周期中最重要的一个环节。

在这一步骤中,完成应用的业务逻辑及数据返回。

2. 路由定义

2.1.http 请求方法

常用的 http 请求方法有下面 4 种:

  • GET
  • POST
  • PUT
  • DELETE

2.2.url 路径

gin 框架,url 路径有三种写法:

  • 静态 url 路径
  • 带路径参数的 url 路径
  • 带星号(*)模糊匹配参数的 url 路径

例子:

// 例子 1,静态 Url 路径, 即不带任何参数的 url 路径
/users/center
/user/111
/food/12

// 例子 2,带路径参数的 url 路径,url 路径上面带有参数, 参数由冒号(:)跟着一个字符串定义。// 路径参数值可以是数值,也可以是字符串

// 定义参数:id,可以匹配 /user/1, /user/899 /user/xiaoli 这类 Url 路径
/user/:id

// 定义参数:id,可以匹配 /food/2, /food/100 /food/apple 这类 Url 路径
/food/:id

// 定义参数:type 和:page,可以匹配 /foods/2/1, /food/100/25 /food/apple/30 这类 Url 路径
/foods/:type/:page

// 例子 3. 带星号(*)模糊匹配参数的 url 路径
// 星号代表匹配任意路径的意思, 必须在 * 号后面指定一个参数名,后面可以通过这个参数获取 * 号匹配的内容。// 以 /foods/ 开头的所有路径都匹配
// 匹配:/foods/1,/foods/200, /foods/1/20, /foods/apple/1 
/foods/*path

// 可以通过 path 参数获取 * 号匹配的内容。

2.3.3. 分组路由

在做 api 开发的时候,如果要支持多个 api 版本,我们可以通过分组路由来实现 api 版本处理。

router := gin.Default()

// 创建 v1 组
v1 := router.Group("/v1")
{
    // 在 v1 这个分组下,注册路由
    v1.POST("/login", loginEndpoint)
    v1.POST("/submit", submitEndpoint)
    v1.POST("/read", readEndpoint)
}

// 创建 v2 组
v2 := router.Group("/v2")
{
    // 在 v2 这个分组下,注册路由
    v2.POST("/login", loginEndpoint)
    v2.POST("/submit", submitEndpoint)
    v2.POST("/read", readEndpoint)
}

上面的例子将会注册下面的路由信息:

  • /v1/login
  • /v1/submit
  • /v1/read
  • /v2/login
  • /v2/submit
  • /v2/read

路由分组,其实就是设置了同一类路由的 url 前缀。

3. 控制器

路由需要配合控制器才能完成一次请求,下面我们来看一下控制器的定义。

控制器函数定义:

func HandlerFunc(c *gin.Context)

控制器函数接受一个上下文参数。
可以通过上下文参数,获取 http 请求参数,响应 http 请求。

下面我们通过一个例子看一下控制器的定义:

// 实例化 gin 实例对象。r := gin.Default()
    
// 定义 post 请求, url 路径为:/users, 绑定 saveUser 控制器函数
r.POST("/users", saveUser)

// 定义 get 请求,url 路径为:/users/:id(:id 是参数,例如: /users/10, 会匹配这个 url 模式),绑定 getUser 控制器函数
r.GET("/users/:id", getUser)

// 定义 put 请求
r.PUT("/users/:id", updateUser)

// 定义 delete 请求
r.DELETE("/users/:id", deleteUser)


// 控制器函数实现
func saveUser(c *gin.Context) {... 忽略实现...}

func getUser(c *gin.Context) {... 忽略实现...}

func updateUser(c *gin.Context) {... 忽略实现...}

func deleteUser(c *gin.Context) {... 忽略实现...}

提示:实际项目开发中不要把路由定义和控制器函数都写在一个 go 文件,不方便维护,可以参考项目结构,规划自己的业务模块。

正文完
 0