登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-18 18:33:34 500浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《如何控制 gin 1.4.0+ 中缺少 URL 参数的行为?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在努力从 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 及以上版本将返回 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() 函数,并具有以下文档:

...以下规则迭代应用,直到不再适用 可以进行处理:

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

reference

如果你在 github 上查看最新的 master 分支,就会发现有一个名为 RemoveExtraSlash 的配置,默认情况下为 false。 removeextraslash 默认情况下不会调用 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

本篇关于《如何控制 gin 1.4.0+ 中缺少 URL 参数的行为?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>