如何为 Gin 框架的路由器添加正则表达式约束?
How to add regex constraints to Gin framework's router?
使用Rails'路由,对于https://www.amazon.com/posts/1
这样的URL,可以用这种方式做
get 'posts/:url', to: 'posts#search', constraints: { url: /.*/ }
使用go的gin framework,没找到这种路由的正则约束方法
r.GET("posts/search/:url", post.Search)
在post控制器中
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")
可以包含斜线。不过还有两个未解决的问题:
Gin 的路由器解码百分比编码的字符 (%2F),所以如果原始 URL 有这样的编码部分,它会错误地结束解码并且与原始 url 不匹配你想提取的。见对应的Github问题:https://github.com/gin-gonic/gin/issues/2047
你只会在你的参数中得到 URLs 的方案+主机+路径部分,查询字符串仍然是分开的,除非你也对其进行编码。例如。 /posts/search/http://google.com/post/1?foo=bar
会给你一个 "/http://google.com/posts/1"
的“url”参数
如上例所示,Gin 中的可选参数也(错误地)总是在字符串的开头包含一个斜杠。
我建议您将 URL 作为编码查询字符串传递。这将减少很多头痛。否则我建议寻找限制较少的不同路由器或框架,因为我认为 Gin 不会很快解决这些问题——它们已经开放多年了。
使用Rails'路由,对于https://www.amazon.com/posts/1
这样的URL,可以用这种方式做
get 'posts/:url', to: 'posts#search', constraints: { url: /.*/ }
使用go的gin framework,没找到这种路由的正则约束方法
r.GET("posts/search/:url", post.Search)
在post控制器中
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")
可以包含斜线。不过还有两个未解决的问题:
Gin 的路由器解码百分比编码的字符 (%2F),所以如果原始 URL 有这样的编码部分,它会错误地结束解码并且与原始 url 不匹配你想提取的。见对应的Github问题:https://github.com/gin-gonic/gin/issues/2047
你只会在你的参数中得到 URLs 的方案+主机+路径部分,查询字符串仍然是分开的,除非你也对其进行编码。例如。
的“url”参数/posts/search/http://google.com/post/1?foo=bar
会给你一个"/http://google.com/posts/1"
如上例所示,Gin 中的可选参数也(错误地)总是在字符串的开头包含一个斜杠。
我建议您将 URL 作为编码查询字符串传递。这将减少很多头痛。否则我建议寻找限制较少的不同路由器或框架,因为我认为 Gin 不会很快解决这些问题——它们已经开放多年了。