【发布时间】:2014-08-24 21:46:17
【问题描述】:
我正在尝试编写一个 Spring REST 控制器,将字符串数组作为 HTTP GET 请求的输入参数。
问题出现在GET请求中,在数组的某些字符串中,我使用了逗号,、空格或正斜杠/等特殊字符,不管我URL 编码 URL HTTP GET 请求的查询部分。
这意味着字符串“1/4 cup ricotta, yogurt”(edit 需要被视为作为输入数组的字符串元素包含的唯一成分)采用以下任一格式:
http://127.0.0.1:8080/[...]/parseThis?[...]&ingredients=1/4 cup ricotta, yogurt
这种格式(请注意空格编码为+加号,而不是十六进制代码):
http://127.0.0.1:8080/[...]/parseThis?[...]&ingredients=1%2F4+cup+ricotta%2C+yogurt
或者这种格式(请注意空格编码为十六进制代码%20):
http://127.0.0.1:8080/[...]/parseThis?[...]&ingredients=1%2F4%20cup%20ricotta%2C%20yogurt
没有正确渲染。
- 系统无法将输入字符串识别为数组的单个元素。
- 在第 2 种和第 3 种情况下,系统以逗号分隔输入字符串并返回一个由 2 个元素而不是 1 个元素组成的数组。我希望这里有 1 个元素。
控制器的相关代码为:
@RequestMapping(
value = "/parseThis",
params = {
"language",
"ingredients"
}, method = RequestMethod.GET, headers = HttpHeaders.ACCEPT + "=" + MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public HttpEntity<CustomOutputObject> parseThis(
@RequestParam String language,
@RequestParam String[] ingredients){
try {
CustomOutputObject responseFullData = parsingService.parseThis(ingredients, language);
return new ResponseEntity<>(responseFullData, HttpStatus.OK);
} catch (Exception e) {
// TODO
}
}
我需要对这个 Spring 控制器执行 HTTP GET 请求,这是一个要求(所以这里不能使用 HTTP POST)。
编辑 1:
如果我将HttpServletRequest request 添加到控制器中方法的签名中,然后我添加一个类似log.debug("The query string is: '" + request.getQueryString() + "'"); 的日志语句,然后我会在日志中看到类似The query string is: '&language=en&ingredients=1%2F4+cup+ricotta%2C+yogurt' 的行(所以仍然是URL 编码)。
编辑 2:
另一方面,如果我将WebRequest request 添加到方法的签名中,日志为log.debug("The query string is: '" + request.getParameter("ingredients") + "'");,那么我在日志中得到一个字符串为The query string is: '1/4 cup ricotta, yogurt'(因此URL 被解码)。
我使用 Apache Tomcat 作为服务器。
我需要在 Spring/webapp 配置文件中添加/查看任何过滤器或其他内容吗?
编辑 3:
主要问题在于逗号的解释:
@ResponseBody
@RequestMapping(value="test", method=RequestMethod.GET)
public String renderTest(@RequestParam("test") String[] test) {
return test.length + ": " + Arrays.toString(test);
// /app/test?test=foo,bar => 2: [foo, bar]
// /app/test?test=foo,bar&test=baz => 2: [foo,bar, baz]
}
可以防止这种行为吗?
【问题讨论】:
-
尝试在您的操作方法中获取请求 QueryString。你如何运行它?我猜应用服务器可能正在为你解码 url。
-
好点,我已经编辑了添加相关信息的问题。谢谢。
-
看这里wiki.apache.org/tomcat/FAQ/CharacterEncoding。我会首先尝试解决这个问题。
-
如果您只关注 Spring 在绑定到数组时将查询参数拆分为逗号这一事实,您可以简化此问题并实现SSCCE。查询编码/空格的事情似乎无关紧要。
标签: java arrays spring rest spring-mvc