Web Services Gin万用字符路由与现有子系恩怨[重复]

jdgnovmf  于 2022-11-15  发布在  其他
关注(0)|答案(3)|浏览(146)

此问题在此处已有答案

Gin router: path segment conflicts with existing wildcard(2个答案)
6个月前关闭。
我想构建一个gin程序,用于以下路径:

r.GET("/special", ... // Serves a special resource.
r.Any("/*", ...       // Serves a default resource.

但是,这样的程序在运行时会出现混乱:

[GIN-debug] GET    /special                  --> main.main.func1 (2 handlers)
[GIN-debug] GET    /*                        --> main.main.func2 (2 handlers)
panic: wildcard route '*' conflicts with existing children in path '/*'

是否可以创建一个轧棉机程序,为每条路线提供默认资源,* 除了 * 为一条路线提供不同资源?
网络上的许多页面让我相信使用默认的杜松子酒路由器是不可能的,那么从杜松子酒程序中为这些路由提供服务的最简单的方法是什么呢?

gstyhher

gstyhher1#

你可以这样试试。

route.GET("/special/*action", func(ctxt *gin.Context) {
  ctxt.JSON(200, gin.H{"message": "WildcardUrl"})
})
uz75evzq

uz75evzq2#

看起来gin.NoRoute(...)函数就可以了。

r.GET("/special", func(c *gin.Context) { // Serve the special resource...
r.NoRoute(func(c *gin.Context) {         // Serve the default resource...

另请参阅https://stackoverflow.com/a/32444263/244128

s4n0splo

s4n0splo3#

也许,其他人(像我)会面临这个错误信息,并会有一个gin.NoRoute()不是一个可接受的修复的情况。
在寻找解决这个问题的方法时,我从github中找到了以下代码片段:

...
router.GET("/v1/images/:path1", GetHandler)           // /v1/images/detail
router.GET("/v1/images/:path1/:path2", GetHandler)    // /v1/images/<id>/history
...

func GetHandler(c *gin.Context) {
    path1 := c.Param("path1")
    path2 := c.Param("path2")

    if path1 == "detail" && path2 == "" {
        Detail(c)
    } else if path1 != "" && path2 == "history" {
        imageId := path1
        History(c, imageId)
    } else {
        HandleHttpError(c, NewHttpError(404, "Page not found"))
    }
}

相关问题