Rest API资源包含点,最后一部分被截断

时间:2018-02-17 00:11:30

标签: java spring rest spring-mvc file-extension

我正在使用Spring在Java中创建一个Rest api并拥有诸如

之类的URL

GET http://host:port/products/{resource}

资源的ID通常与版本号相似,例如3.2或更详细的示例x-light.5p

不幸的是,Spring似乎切断了最后一部分,认为它是一个扩展(如.html.png)所以实际进入我的控制器的不是3.2而是{{1而不是3而是x-light.5p。我进行了一些实验,发现用一个额外的斜杠结束请求确实有效:x-light确实完全进入控制器。

出于显而易见的原因,改变我们的身份是不行的。为什么Spring表现得这样,我可以改变它吗?如果我将控制器映射从GET http://host:port/products/x-light.5p/更改为/products/{resource},会发生什么?这是一种强制执行api的人追加最后一个斜线的方法吗?我认为最后的斜线大多是多余的。

2 个答案:

答案 0 :(得分:0)

您可以尝试在@ 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());

}

答案 1 :(得分:0)

像这样的用户路径映射

  

{资源:+}

@RequestMapping(method = RequestMethod.GET, value = "/products/{resource:.+}")
    public void myMthod(@PathVariable("id") String resource) {

    ....
    }