乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

    • Golang基础知识

    • Golang进阶知识

    • Golang常用包

    • Gin框架

      • 安装
      • gin路由
        • 请求数据参数绑定
        • gin渲染
        • 使用模板渲染
        • 静态文件的使用
        • 数据渲染
        • gin重定向
        • gin同步和异步
        • go中间件
        • 会话保持
        • 文件上传
        • JWT的简单使用
        • 模板函数
        • Swagger
        • API访问控制
        • 常见的应用中间件
        • 应用配置管理
        • 优雅停止与重启
        • 集成Casbin进行访问权限控制
    • AIOps

    • Python

    • DevOps

    • 专栏
    • Golang
    • Gin框架
    乔克
    2025-07-19
    目录

    gin路由

    # 普通路由

    r.GET("/index", func(c *gin.Context) {...})
    r.GET("/login", func(c *gin.Context) {...})
    r.POST("/login", func(c *gin.Context) {...})
    
    1
    2
    3

    此外,还有一个可以匹配所有请求方法的Any方法如下:

    r.Any("/test", func(c *gin.Context) {...})
    
    1

    为没有配置处理函数的路由添加处理程序,默认情况下它返回 404 代码,下面的代码为没有匹配到路由的请求都返回views/404.html页面。

    r.NoRoute(func(c *gin.Context) {
    		c.HTML(http.StatusNotFound, "views/404.html", nil)
    	})
    
    1
    2
    3

    # 路由组

    我们可以将拥有共同 URL 前缀的路由划分为一个路由组。习惯性一对{}包裹同组的路由,这只是为了看着清晰,你用不用{}包裹功能上没什么区别。

    func main() {
    	r := gin.Default()
    	userGroup := r.Group("/user")
    	{
    		userGroup.GET("/index", func(c *gin.Context) {...})
    		userGroup.GET("/login", func(c *gin.Context) {...})
    		userGroup.POST("/login", func(c *gin.Context) {...})
    	}
    	shopGroup := r.Group("/shop")
    	{
    		shopGroup.GET("/index", func(c *gin.Context) {...})
    		shopGroup.GET("/cart", func(c *gin.Context) {...})
    		shopGroup.POST("/checkout", func(c *gin.Context) {...})
    	}
    	r.Run()
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    路由组也是支持嵌套的,例如:

    shopGroup := r.Group("/shop")
    	{
    		shopGroup.GET("/index", func(c *gin.Context) {...})
    		shopGroup.GET("/cart", func(c *gin.Context) {...})
    		shopGroup.POST("/checkout", func(c *gin.Context) {...})
    		// 嵌套路由组
    		xx := shopGroup.Group("xx")
    		xx.GET("/oo", func(c *gin.Context) {...})
    	}
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    通常我们将路由分组用在划分业务逻辑或划分 API 版本时。

    # 路由原理

    Gin 框架中的路由使用的是httprouter (opens new window)这个库。

    其基本原理就是构造一个路由地址的前缀树。

    # Handler 处理器

    路由需要传入两个参数,一个为路径,另一个为路由执行的方法,我们叫做它处理器 Handler ,而且,该参数是可变长参数。也就是说,可以传入多个 handler,形成一条 handler chain 。

    同时对 handler 该函数有着一些要求,该函数需要传入一个 Gin.Context 指针,同时要通过该指针进行值得处理。

    Handler 函数可以对前端返回 字符串,Json,Html 等多种格式或形式文件。

    我们已GET为例,其内部实现如下:

    func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes {
    	return group.handle(http.MethodGet, relativePath, handlers)
    }
    
    1
    2
    3

    # 获取路由路径中的参数

    # 获取路径中的参数

    获取路径中的参数用context.Param。在定义路由的时候用/:后面的符号是一个占位符,我们可以对该值进行传值。如下:

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1、创建路由
    	g := gin.Default()
    	// 2、绑定路由规则,执行视图函数
    	g.GET("/usr/:name", func(c *gin.Context) {
    		// 获取值
    		name := c.Param("name")
    		// 3、返回值
    		c.String(http.StatusOK,name)
    	})
    	// 4、开启监听
    	g.Run(":8000")
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20

    然后我们在浏览器上输入如下地址http://127.0.0.1:8000/usr/joker,那么我们获取到的 name 就是 joker,并返回给我们,如下:

    a6f1f05963bb0f1f357f089350a0462f MD5

    # 获取 queryString 参数

    querystring指的是 URL 中?后面携带的参数,例如:/user/search?username=joker&age=30。

    获取请求的 querystring 参数的方法如下:

    package main
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    )
    
    func main() {
    	// 1、创建路由
    	g := gin.Default()
    	// 2、绑定路由规则,执行视图函数
    	g.GET("/usr/:name", func(c *gin.Context) {
    		// 获取值
    		name := c.Param("name")
    		username := c.Query("username")
    		age := c.Query("age")
    		// 3、返回值
    		c.String(http.StatusOK,"name: "+name+" username: "+username+"age: "+age)
    	})
    	// 4、开启监听
    	g.Run(":8000")
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    13d6da61d2a59ec928c0f750848aeeb4 MD5

    还可以使用DefaultQuery()为没有设置参数的值设置一个默认值。

    如下:

    username := c.DefaultQuery("username", "joker")
    
    1

    使用 QueryArray()获取多个值。

    ids = c.QueryArrary("ids")
    
    1

    请求:http://127.0.0.1:8000/query?ids=1,2,3,4,5

    使用 QueryMap()获取 Map 类型的数据

    user = c.QueryMap("name")
    
    1

    请求:http://127.0.0.1:8000/query?user[name]=joker&user[age]=18

    作者:乔克

    本文链接:https://jokerbai.com

    版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

    上次更新: 2025/07/19, 09:17:41
    安装
    请求数据参数绑定

    ← 安装 请求数据参数绑定→

    最近更新
    01
    使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
    07-19
    02
    使用Zadig从0到1实现持续交付平台
    07-19
    03
    基于Jira的运维发布平台
    07-19
    更多文章>
    Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式