regex 如何将正则表达式约束添加到Gin框架的路由器?

0wi1tuuw  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(99)

使用Rails的路由,对于像https://www.amazon.com/posts/1这样的URL,可以使用这种方式来做

get 'posts/:url', to: 'posts#search', constraints: { url: /.*/ }

字符串
使用go的gin framework,没有找到一个regex约束方法来进行这样的路由

r.GET("posts/search/:url", post.Search)


在岗位控制器

func Search(c *gin.Context) {
    fmt.Println(c.Param("url"))
}


当调用http://localhost:8080/posts/search/https://www.amazon.com/posts/1时,它返回404代码。
https://play.golang.org/p/dsB-hv8Ugtn

➜  ~ curl http://localhost:8080/site/www.google.com
Hello www.google.com%
➜  ~ curl http://localhost:8080/site/http://www.google.com/post/1
404 page not found%
➜  ~ curl http://localhost:8080/site/https%3A%2F%2Fwww.google.com%2Fpost%2F1
404 page not found%
➜  ~ curl http://localhost:8080/site/http:\/\/www.google.com\/post\/1
404 page not found%

bxgwgixi

bxgwgixi1#

Gin不支持路由器中的正则表达式。这可能是因为它构建了一个路径树,以便在遍历时不必分配内存,从而获得出色的性能。
对路径的参数支持也不是很强大,但您可以通过使用可选参数(如

c.GET("/posts/search/*url", ...)

字符串
现在,c.Param("url")可以包含斜杠。但有两个问题尚未解决:

  1. Gin的路由器解码百分比编码字符(%2F),所以如果原始URL有这样的编码部分,它将错误地结束解码,并不匹配您想要提取的原始URL。请参阅相应的Github问题:https://github.com/gin-gonic/gin/issues/2047
    1.在参数中只能得到URL的scheme+host+path部分,查询字符串仍然是独立的,除非也对它进行编码。例如,/posts/search/http://google.com/post/1?foo=bar会给予"/http://google.com/posts/1"的“url”参数
    正如上面的例子所示,Gin中的可选参数也总是(错误地)在字符串的开头包含一个斜杠。
    我建议您将URL作为编码的查询字符串传递。这会减少很多头痛。否则,我会建议寻找一个不同的路由器或框架,是较少的限制,因为我不认为金酒将解决这些问题很快-他们已经开放多年。
umuewwlo

umuewwlo2#

r.GET("/users/:regex",UserHandler)

func UserHandler(c *gin.Context) {
    r, err := regexp.Compile(`[a-zA-Z0-9]`)
    if err != nil {
       panic(err)
       return
    }
    username := c.Param("regex")
    if r.MatchString(username) == true {
        c.File("index.html")
    }
}

字符串

相关问题