Go Chi路由将子路由路径误识别为URL参数问题求助
问题原因分析
你遇到的*参数被映射为product的情况,是因为在chi路由的子路由组中使用了以斜杠开头的路径导致的。
具体来说:
- 你通过
baseRouter.Route("/{param1}/{param2}/dummy/new", ...)创建了一个路由组,该组的前缀是/{param1}/{param2}/dummy/new。 - 在子路由中定义路径时,你使用了
/product、/product/report这类以/开头的写法。chi在处理这种路径时,会将斜杠后的部分(如product)当作通配符*的捕获值,而非固定路径的一部分,因此会在RouteContext的URLParams中出现*这个参数。
解决方案
修改productHandler.MountRoutes函数中的路由路径,去掉路径开头的斜杠,让路径相对于父路由组的前缀进行拼接:
func (h Handler) MountRoutes(r chi.Router) { r.MethodFunc(http.MethodGet, "product/report/{report_id}", h.ExportStatus) r.MethodFunc(http.MethodPost, "product/report", h.ExportProducts) r.MethodFunc(http.MethodPost, "product", h.GetProducts) }
修改后,当请求/val1/val2/dummy/new/product时,RouteContext的URLParams只会包含你定义的param1和param2两个参数,不再出现多余的*参数。
验证说明
调整路径写法后,chi会将子路由路径与父组前缀正确拼接为完整路由(如/{param1}/{param2}/dummy/new/product),此时路由匹配时只会捕获你显式定义的路径参数,不会将固定路径部分当作通配符参数捕获。
内容的提问来源于stack exchange,提问作者vignesh
相关产品推荐
相关产品推荐

