【问题标题】:How to bypass the "wildcard route id conflicts with existing children in path" error?如何绕过“通配符路由 id 与路径中现有子项冲突”错误?
【发布时间】:2020-10-24 02:43:14
【问题描述】:
r.GET("/v1.0/:pageId/page", (&page.API{}).Get)
r.POST("/v1.0/:labelId/label", (&label.API{}).Post)

这是一个著名的杜松子酒问题,这将导致wildcard route id conflicts with existing children in path。但是,我正在编写此脚本以返回模拟结果进行测试,因此绝对需要保留此 URL 结构。大多数解决方案只使用 2 个通配符,并处理它指向的函数中的不同部分。但是,由于这是使用不同的 HTTP 方法(GET 和 POST),所以不可能使用这种方法来解决问题。是否有其他方法可以保留此 URL 结构?

【问题讨论】:

    标签: go routes go-gin


    【解决方案1】:

    不确定是否是最好的方法。这可以正常工作:

    使用组:

    v10Group := r.Group("/v1.0/:id", checkTheId)
    {
        v10Group.GET("/page", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "msg":"Now you are trying to visit a page",
                "id_page": c.Param("id"),
            })
        })
        v10Group.GET("/label", func(c *gin.Context) {
            c.JSON(200, gin.H{
                "msg":"Now you are trying to visit a label",
                "id_label": c.Param("id"),
            })
        })
    }
    

    还有一个检查id的中间件,保存在gin.Context中。

    func checkTheId(c *gin.Context)  {
        id := c.Param("id")
        b, err := strconv.Atoi(id) // judge whether it is a number
        if err != nil{
            c.JSON(400,gin.H{
                "msg":"Parameter invalid, Please input a number", 
            })
            c.Abort()
            return
        }
        c.Set("id", b)
    }
    

    结果:

    【讨论】:

      猜你喜欢
      • 2016-07-21
      • 2020-03-27
      • 2019-03-21
      • 2020-02-11
      • 1970-01-01
      • 2012-04-05
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多