Go路由中/.为何匹配/而非/{id}?点作为ID无法被识别
路由匹配行为解析
这是因为主流Go路由库(比如gorilla/mux,这类路由配置最常用的实现)在处理请求前,会自动对路径做规范化预处理:
- 当请求路径是
/.时,路由库会把它等价转换成根路径/,自然就匹配到了你定义的Path("/")对应的searcher处理器。 - 而像
/某个ID(比如/abc123)这类路径,末尾没有特殊的点字符,不会被规范化修改,所以能正常匹配到/{id}对应的getter处理器。
如果想让/.路径匹配到getter处理器,可以关闭路由的自动规范化功能。以gorilla/mux为例,只需给路由添加SkipClean(true)配置:
v1Router := mux.NewRouter() v1Router.SkipClean(true) // 关闭路径规范化 v1Router.Path("/{id}").Methods(http.MethodGet).Handler(r.getter()) v1Router.Path("/").Methods(http.MethodGet).Handler(r.searcher())
此时/.会被识别为{id}参数值为.的请求,从而路由到getter处理器。
内容的提问来源于stack exchange,提问作者awanish kumar
相关产品推荐
相关产品推荐

