【基于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"})
		})
	}
}
相关推荐
用户574385305111 分钟前
第 3 章:引入 Knex + Schema 自动加载
后端
flash俊杰15 分钟前
合并式恢复的事务边界:幂等跳过、外键顺序与向量重建标记
后端
FungLeo23 分钟前
成为全栈·Go 后端篇·跨语言认证兼容:Node 与 Go 如何互认 JWT 和密码
golang·go·jwt·身份认证·成为全栈·bcrypt
学长毕设25 分钟前
基于springboot的实验室设备管理系统
java·spring boot·后端
2401_8858850427 分钟前
巴林语音通知接口如何对接?系统告警语音API接入教程
android·前端·网络·python·语音识别
java1234_小锋28 分钟前
【技术专题】CSS3 网页技术 - CSS3 盒模型
前端·css·css3
计算机魔术师30 分钟前
手握芯片、又要吞下开源分发入口,英伟达被盯上了
前端
学长毕设1 小时前
基于springboot的社区养老监护系统的设计与实现
java·spring boot·后端
会编程的吕洞宾1 小时前
RAG检索质量怎么评估?3个指标+LLM裁判实战
java·开发语言·人工智能·后端