一、前言
路由是 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 路由组的优势
- 接口分类清晰,视频、用户、文章模块路由分开管理
- 可以给整个路由组统一添加中间件(权限校验、日志打印)
- 后期修改公共前缀时,只需要修改
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"})
})
}
}