[英]How to correctly escape '/' in Spring Rest @PathVariable
在Spring Boot 1.5.4中,我有一个如下的请求映射:
@RequestMapping(value = "/graph/{graphId}/details/{iri:.+}",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public JSONObject getGraph(@PathVariable Long graphId,
@PathVariable String iri) {
log.debug("Details called for graph ID {} for IRI {}", graphId, iri);
return detailsService.getDetails(graphId, iri);
}
访问
HTTP://本地主机:9000 / API / V1 /图形/ 2 /信息/ HTTP%3Anthnth33
工作正常,服务器正确映射了请求,代码返回了预期的结果
但是访问
给出错误的服务器请求 (无法加载资源:服务器以400(错误请求)的状态响应)。 在这种情况下,甚至没有完成映射到端点的请求。
显然,编码为%2F的斜杠“ /”(使用encodeURIComponent())会引起麻烦。 为什么? 我想念什么? uri参数应该如何编码?
问题不仅在于如何提取PathVariables,还在于如何强制String识别正确的映射。
您的示例的问题是Spring如何进行路径匹配。 您提供的URL作为示例
http://localhost:9000/api/v1/graph/2/details/http%3A%2F%2Fserverurl.net%2Fv1%2Fus%2Fh.schumacher%408tsch.net%2Fn%2FLouSchumacher
将被容器解码为
在由Spring Matcher处理之前。 这使得matche认为这只是http:
对应{iri:.+}
和后来去/
所以这是你没有一个映射一些较长的路径。
这里描述的方法应该对您有用:Spring 3 RequestMapping:获取路径值
@RequestMapping(value = "/graph/{graphId}/details/**",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public JSONObject getGraph(@PathVariable Long graphId,
HttpServletRequest request) {
String iri = (String) request.getAttribute(
HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
log.debug("Details called for graph ID {} for IRI {}", graphId, iri);
return detailsService.getDetails(graphId, iri);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.