【基于GO的Web开发15】gin路由和路由组

一、前言

路由是 Web 服务的基础,负责将客户端的请求 URL 分发到对应的处理函数 。本篇笔记讲解 Gin 普通路由、Any匹配全部请求、404 自定义、路由分组Group,附带完整代码案例与复习要点。


二、普通基础路由

1. 常用 HTTP 请求方法路由

Gin 支持直接绑定 GET、POST、PUT、DELETE 等 RESTful 常用请求方式。

表格

请求方法 作用
r.GET() 查询数据
r.POST() 新增 / 提交数据
r.PUT() 更新数据
r.DELETE() 删除数据

完整示例代码

Go 复制代码
package main

import (
	"net/http"

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

func main() {
	r := gin.Default()

	// GET 请求
	r.GET("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "GET",
		})
	})
	// POST 请求
	r.POST("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "POST",
		})
	})
	// PUT 请求
	r.PUT("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "PUT",
		})
	})
	// DELETE 请求
	r.DELETE("/index", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"method": "DELETE",
		})
	})

	r.Run(":8080")
}

💡注意:同一个路径/index可以绑定不同请求方法,视为完全不同的接口。

2. r.Any () ------ 匹配所有请求方法(大杂烩)

Any可以接收 GET/POST/PUT/DELETE 任意一种请求方式。

Go 复制代码
// 无论什么请求方式访问 /test,都会命中该函数
r.Any("/test", func(c *gin.Context) {
	c.JSON(http.StatusOK, gin.H{"msg":"Any接收所有请求"})
})

3. r.NoRoute () ------ 自定义 404 页面

当访问的路由没有匹配到任何处理函数时,默认返回 404。 NoRoute用来统一捕获 404 请求,自定义返回内容。

Go 复制代码
// 需要提前加载html模板文件
r.NoRoute(func(c *gin.Context) {
	c.HTML(http.StatusNotFound, "views/404.html", nil)
})

三、路由组 r.Group ()

3.1 什么是路由组

路由组等价于给一批接口添加统一 URL 前缀,适合归类同一模块下的多个接口。 类比于 Flask 中的蓝图,用来实现接口模块化管理。

例如视频模块下一堆接口: /video/index、/video/xx、/video/oo 公共前缀:/video

3.2 代码示例(推荐大括号包裹写法,可读性更高)

Go 复制代码
package main

import (
	"net/http"
	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

	// 创建路由组,统一前缀 /video
	videoGroup := r.Group("/video")
	{
		videoGroup.GET("/index", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/index"})
		})

		videoGroup.GET("/xx", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/xx"})
		})

		videoGroup.GET("/oo", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/oo"})
		})
	}

	r.Run(":8080")
}

访问地址:

3.3 路由组的优势

  1. 接口分类清晰,视频、用户、文章模块路由分开管理
  2. 可以给整个路由组统一添加中间件(权限校验、日志打印)
  3. 后期修改公共前缀时,只需要修改Group("/video")一处代码

四、普通路由 VS 路由组对比总结

表格

类型 适用场景 示例地址
普通路由 少量、零散无统一前缀的接口 /login /register
路由组 Group 同一业务模块下大量平级接口 /video/index /video/list

五、拓展:嵌套路由组(进阶复习)

路由组还可以继续嵌套,实现多级前缀:

Go 复制代码
videoGroup := r.Group("/video")
{
	// 二级路由 /video/admin
	admin := videoGroup.Group("/admin")
	{
		admin.GET("/list", func(c *gin.Context) {
			c.JSON(http.StatusOK, gin.H{"msg": "/video/admin/list"})
		})
	}
}
相关推荐
用户033307413951 小时前
TypeScript using 与 AsyncDisposableStack:在真实服务端代码中协调多资源清理
前端
daisychey1 小时前
用 Playwright 做多平台内容分发,我踩过的 8 个坑
前端
调试人生的显微镜1 小时前
iOS开发入门:Interface Builder、基础控件及UITextField详解
后端·ios
泡海椒2 小时前
巡检照片与工单附件:jquick-pdf 图片嵌入的业务实战
后端
蜗牛互联网2 小时前
Python消费Responses SSE事件:增量文本、超时与取消
java·开发语言·人工智能·后端·python
AI持续学习2 小时前
文档权限变更如何回归测试?账号、空间、文件和分享链接用例清单
后端
ttwuai2 小时前
Go后台管理系统开源项目:4个官方仓库怎么追溯和核验
开发语言·golang·开源
谢亮_vipxieliang2 小时前
Go Worker Pool 设计——从原理到生产级实现
开发语言·后端·golang
IT_陈寒3 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
大龄秃头程序员3 小时前
iOS冷启动监控Demo
前端