为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
www说 2022-04-26 19:42:53
我正在从1.3.0to 1.4.0(or 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以上将返回404.是否可以控制这种行为?(以与以前相同的方式工作1.3.0?)我试过使用BindUri引入1.5.0func 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在调用时也会失败(带有 )。
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

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

... 迭代应用以下规则,直到无法进行进一步处理:

  1. 用一个斜杠替换多个斜杠。

参考

如果您在 Github 上签出最新的 master 分支,则会有一个名为RemoveExtraSlash的配置,默认情况下为 false。RemoveExtraSlash默认情况下不会在cleanPath()这里调用。

我可以看到这是在 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


查看完整回答
反对 回复 2022-04-26
  • 1 回答
  • 0 关注
  • 196 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号