如何为Go Gin-Gonic路由组实现Not Found路由处理?
Gin 路由组自定义404处理方案
Gin 的 RouterGroup 并没有内置 NoRoute 方法,要实现特定路由组的自定义404响应,可采用以下两种可行方案:
方法一:通过中间件拦截路由组未匹配请求
在目标路由组中添加专属中间件,先让正常路由匹配执行,后续检查响应状态是否为404且请求路径属于当前组,再返回自定义404内容。
修改后的代码示例:
import ( "net/http" "strings" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 处理 /sub 路由组 rGroup := r.Group("/sub") // 添加路由组专属404拦截中间件 rGroup.Use(func(c *gin.Context) { // 先执行后续路由匹配逻辑 c.Next() // 检查是否为未匹配请求且路径属于当前组 if c.Writer.Status() == http.StatusNotFound && strings.HasPrefix(c.Request.URL.Path, "/sub") { c.JSON(http.StatusNotFound, gin.H{ "message": "sub路由组下的资源不存在", }) c.Abort() // 终止后续流程 } }) { rGroup.GET("/a", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "found /sub/a"}) }) } // 处理根路由 r.GET("/a", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "found /a"}) }) r.NoRoute(func(c *gin.Context) { c.JSON(http.StatusNotFound, gin.H{ "message": "根路由下的资源不存在", }) }) r.Run(":8000") }
方法二:创建子Gin引擎挂载到路由组
创建独立的Gin子引擎,在子引擎上定义专属的NoRoute逻辑,再将子引擎挂载到目标路由组,实现路由组的独立路由管理。
代码示例:
import ( "net/http" "strings" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 创建子引擎处理 /sub 路由组 subEngine := gin.Default() subEngine.GET("/a", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "found /sub/a"}) }) // 子引擎定义专属404响应 subEngine.NoRoute(func(c *gin.Context) { c.JSON(http.StatusNotFound, gin.H{ "message": "sub路由组下的资源不存在", }) }) // 将子引擎挂载到根路由的 /sub 路径 r.Any("/sub/*any", func(c *gin.Context) { // 重写请求路径,去掉 /sub 前缀后交由子引擎处理 path := strings.TrimPrefix(c.Request.URL.Path, "/sub") if path == "" { path = "/" } c.Request.URL.Path = path subEngine.HandleContext(c) }) // 处理根路由 r.GET("/a", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "found /a"}) }) r.NoRoute(func(c *gin.Context) { c.JSON(http.StatusNotFound, gin.H{ "message": "根路由下的资源不存在", }) }) r.Run(":8000") }
内容的提问来源于stack exchange,提问作者TheLovelySausage
相关产品推荐
相关产品推荐

