You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:14:57