如何控制 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:
- Replace multiple slashes with a single slash.
如果您在 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
我正在努力从 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:
- Replace multiple slashes with a single slash.
如果您在 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