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



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

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

使用go的gin框架,没有找到这样一个路由的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%

Gin不支持路由器中的正则表达式。这可能是因为它构建了一个路径树,以便在遍历时不必分配内存,从而获得优异的性能。

路径的参数支持也不是很强大,但你可以通过使用等可选参数来解决这个问题

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

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

  1. Gin的路由器解码百分比编码字符(%2F(,因此如果原始URL有这样的编码部分,它最终会被错误解码,与您想要提取的原始URL不匹配。请参阅相应的Github问题:https://github.com/gin-gonic/gin/issues/2047

  2. 您只会在参数中获得URL的scheme+host+路径部分,查询字符串仍然是独立的,除非您也对其进行编码。例如CCD_ 4会给你一个";url";"/http://google.com/posts/1"参数

如上例所示,Gin中的可选参数也(错误地(总是在字符串开头包含斜线。

我建议您将URL作为编码的查询字符串进行传递。这将大大减少头痛。否则,我建议寻找一个限制性较小的不同路由器或框架,因为我认为Gin不会很快解决这些问题——它们已经开放多年了。

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")
}
}

相关内容

  • 没有找到相关文章

最新更新