我正在使用Spring在Java中创建一个Rest api,并且具有诸如
GET http://host:port/products/{resource}
资源的 id 通常类似于版本号(如3.2
)或更详细的示例x-light.5p
。
不幸的是,Spring似乎切断了最后一部分,认为它是一个扩展(如.html
或.png
),所以实际进入我的控制器的不是3.2
而是3
,不是x-light.5p
而是x-light
。我做了一些实验,注意到用额外的斜杠结束请求确实有效:GET http://host:port/products/x-light.5p/
确实完全进入控制器。
出于显而易见的原因,更改我们的 ID 是不行的。为什么春天会这样,我可以改变它吗?如果我将控制器映射从/products/{resource}
更改为/products/{resource}/
,会发生什么情况?这是强制调用 api 的人附加最后一个斜杠的一种方式吗?我认为最后一个斜杠大部分是多余的。
这样的用户路径映射
{资源:.+}
@RequestMapping(method = RequestMethod.GET, value = "/products/{resource:.+}")
public void myMthod(@PathVariable("id") String resource) {
....
}
您可以尝试@benji2505帖子或以下帖子中提到的解决方案。
@RequestMapping(value = "/products/**", method = RequestMethod.GET)
public void products(HttpServletRequest request, HttpServletResponse response) {
String pattern = (String)request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
String resource = new AntPathMatcher().extractPathWithinPattern(pattern, request.getPathInfo());
}