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

一、前言

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


二、普通基础路由

1. 常用 HTTP 请求方法路由

Gin 支持直接绑定 GETPOSTPUTDELETE 等 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"})
		})
	}
}
相关推荐
JaguarJack41 分钟前
PHP 8.6 只是个小版本,三十项弃用却已在为 PHP 9.0 铺路
后端·php·服务端
BingoGo43 分钟前
PHP 8.6 只是个小版本,三十项弃用却已在为 PHP 9.0 铺路
后端·php
Bs_MoneyMagnet4 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
AlienZHOU8 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
狗头大军之江苏分军10 小时前
《潮水漫过十七岁》开学了
后端
苏三说技术11 小时前
如何看待GPT-6在UP主众测中碾压夺冠?它是现在最强大模型吗?
后端
mldong11 小时前
一份 JSON,一条能跑的审批流:把报销流程送上工作流引擎
后端·架构
wno70411 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
Captaincc11 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
aramae12 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端