Gorilla Mux路由匹配异常:静态路径错误命中通配符路由问题求解
问题原因
Gorilla Mux的路由匹配规则是按注册顺序从上到下匹配,命中第一个符合条件的路由就终止匹配。你先注册了带路径参数的/nfdm-fdm/v2/{id},请求路径/nfdm-fdm/v2/shared-data中的shared-data会被识别为{id}参数的值,所以直接命中了第一个DataSetsGet对应的路由,不会继续匹配后面的shared-data固定路径路由。
解决方案
两种方案二选一即可:
方案1:调整路由注册顺序
把更精确的固定路径路由放在通配型的参数路由前面注册,修改routes变量的定义顺序:
var routes = Routes{ // 先注册固定路径的精确路由 Route{ "RetrieveSharedData", strings.ToUpper("Get"), "/nfdm-fdm/v2/shared-data", RetrieveSharedData, }, // 后注册带参数的通配路由 Route{ "DataSetsGet", strings.ToUpper("Get"), "/nfdm-fdm/v2/{id}", DataSetsGet, }, }
方案2:给路径参数增加正则匹配限制
如果你的{id}参数有固定格式规则(比如纯数字、特定前缀等),可以给参数加上正则约束,让不符合格式的路径不会命中该路由,比如id为纯数字的场景修改如下:
Route{ "DataSetsGet", strings.ToUpper("Get"), "/nfdm-fdm/v2/{id:[0-9]+}", // 限制id只能是数字 DataSetsGet, },
该场景下shared-data因为不符合数字格式,不会匹配到第一个路由,会继续命中后面的RetrieveSharedData路由。
内容的提问来源于stack exchange,提问作者van
相关产品推荐
相关产品推荐

