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

ioo*_*ooi 1 regex frameworks routes url-routing go

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

\n
get \'posts/:url\', to: \'posts#search\', constraints: { url: /.*/ }\n
Run Code Online (Sandbox Code Playgroud)\n

使用go的gin框架,没有找到这样的路由的正则约束方法

\n
r.GET("posts/search/:url", post.Search)\n
Run Code Online (Sandbox Code Playgroud)\n

在后置控制器中

\n
func Search(c *gin.Context) {\n    fmt.Println(c.Param("url"))\n}\n
Run Code Online (Sandbox Code Playgroud)\n

调用时http://localhost:8080/posts/search/https://www.amazon.com/posts/1,返回404代码。

\n
\n

就像https://play.golang.org/p/dsB-hv8Ugtn

\n
\xe2\x9e\x9c  ~ curl http://localhost:8080/site/www.google.com\nHello www.google.com%\n\xe2\x9e\x9c  ~ curl http://localhost:8080/site/http://www.google.com/post/1\n404 page not found%\n\xe2\x9e\x9c  ~ curl http://localhost:8080/site/https%3A%2F%2Fwww.google.com%2Fpost%2F1\n404 page not found%\n\xe2\x9e\x9c  ~ curl http://localhost:8080/site/http:\\/\\/www.google.com\\/post\\/1\n404 page not found%\n
Run Code Online (Sandbox Code Playgroud)\n

小智 5

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

对路径的参数支持也不是很强大,但您可以通过使用可选参数来解决该问题,例如

c.GET("/posts/search/*url", ...)
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 您只能在参数中获得 URL 的方案+主机+路径部分,查询字符串仍然是单独的,除非您也对其进行编码。例如/posts/search/http://google.com/post/1?foo=bar会给你一个“url”参数"/http://google.com/posts/1"

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

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