如何控制 gin 1.4.0+ 中缺少 URL 参数的行为?

How to control behavior for missing URL params in gin 1.4.0+?

我正在努力从 1.3.0 迁移到 1.4.0(或 1.5.0),我发现 1.3.0 对于以下代码段

router := gin.New()
router.GET("/func/:id/details", func(c *gin.Context) {
    value := c.Param("id")
    fmt.Printf("value is %v\n", value)
})

即使在请求 /func//details 时也会始终到达处理程序(注意缺少的 URL param),而 1.4.0 及更高版本将 return 404.

是否可以控制这种行为? (与 1.3.0 中的工作方式相同?)

我试过使用 1.5.0

中介绍的 BindUri
func main() {
    type Params struct {
        ID string `uri:"id" binding:"required"`
    }
    router := gin.New()
    router.GET("/func/:id/details", func(c *gin.Context) {
        var pp Params
        if err := c.BindUri(&pp); err != nil {
            log.Errorf("failed binding: %v", err)
            c.Status(http.StatusBadRequest)
            return
        }

        log.Printf("params %+v\n", pp)
    })

    if err := router.Run("localhost:8080"); err != nil {
        panic(err)
    }
}

但这在调用时也会失败(404)。

我发现问题出在具有以下文档的内部 cleanPath() 函数上:

... The following rules are applied iteratively until no further processing can be done:

  1. Replace multiple slashes with a single slash.

reference

如果您在 Github 上签出最新的 master 分支,则会有一个名为 RemoveExtraSlash and is false by default. The RemoveExtraSlash by default will not call cleanPath()here 的配置。

据我所知,这是在 11 月 28 日添加的,1.5.0 的最新提交是在 11 月 24 日。

您可以从 GitHub 下载源代码:

git clone https://github.com/gin-gonic/gin.git /home/user/projects/gin

然后在 go.mod 文件的末尾进行替换。当有新版本时,您可以删除该行:

replace github.com/gin-gonic/gin => /home/user/projects/gin