Reitit路由配置问题:如何优先匹配固定路径而非动态参数
解决Reitit静态路由与动态参数路由的匹配优先级问题
要让/something/v2/xxx/yyy优先匹配v2对应的路由,而非被识别为动态参数/:part1/:part2,可以通过以下两种方式配置:
方法1:利用静态路径段的天然优先级,调整路由结构
Reitit默认会优先匹配静态路径段的路由,只要把v2相关路由定义放在动态参数路由之前,并简化冗余嵌套结构即可:
(ring/router [["/v2/:part1/:part2" { :get {:handler some-handler-v2}}] ["/:part1/:part2" { :get {:handler some-handler}}]])
如果需要更清晰的层级划分,也可以把/v2作为独立的父路由节点:
(ring/router [["/v2" ["/:part1/:part2" { :get {:handler some-handler-v2}}]] ["/:part1/:part2" { :get {:handler some-handler}}]])
方法2:显式指定路由优先级
如果静态路由的天然优先级在复杂嵌套场景下不生效,可以通过:priority键手动给v2路由设置更高优先级:
(ring/router [["/v2/:part1/:part2" { :priority 100 ; 数值越高优先级越高,默认优先级为0 :get {:handler some-handler-v2}}] ["/:part1/:part2" { :priority 0 :get {:handler some-handler}}]])
注意事项
- 移除冗余的嵌套
["" ...]结构:原代码中每个路由下的["" ...]属于冗余配置,会增加匹配复杂度,直接将handler配置在对应路径节点即可。 - 确认挂载路径正确性:API挂载在
/something/下时,路由定义中的路径为相对路径,最终匹配的完整路径是/something/加上路由定义的路径,无需在路由里重复写/something/。
内容的提问来源于stack exchange,提问作者Billy Moon
相关产品推荐
相关产品推荐

