Java SpringREST控制器在具有空格或逗号等特殊字符时理解字符串数组
我试图编写一个SpringREST控制器,获取一个字符串数组作为HTTPGET请求的输入参数 问题出现在GET请求中,在数组的某些字符串中,我使用特殊字符,如逗号Java SpringREST控制器在具有空格或逗号等特殊字符时理解字符串数组,java,arrays,spring,rest,spring-mvc,Java,Arrays,Spring,Rest,Spring Mvc,我试图编写一个SpringREST控制器,获取一个字符串数组作为HTTPGET请求的输入参数 问题出现在GET请求中,在数组的某些字符串中,我使用特殊字符,如逗号,,空格或正斜杠/,,无论我是否对URL HTTP GET请求的查询部分进行URL编码 这意味着字符串“1/4杯意大利乳清干酪,酸奶”(编辑,需要将其视为包含在输入数组字符串元素中的唯一成分)采用以下格式之一: http://127.0.0.1:8080/[...]/parseThis?[...]&ingredients=1/4
,
,空格
或正斜杠/
,,无论我是否对URL HTTP GET请求的查询部分进行URL编码
这意味着字符串“1/4杯意大利乳清干酪,酸奶
”(编辑,需要将其视为包含在输入数组字符串元素中的唯一成分)采用以下格式之一:
http://127.0.0.1:8080/[...]/parseThis?[...]&ingredients=1/4 cup ricotta, yogurt
此格式(请注意编码为<代码> +/code > +,而不是十六进制代码的空白空间:
或此格式(请注意空白编码为十六进制代码<代码> % 20 < /代码>):
未正确渲染- 系统无法将输入字符串识别为数组的单个元素
- 在第二种和第三种情况下,系统以逗号分隔输入字符串,并返回由2个元素组成的数组,而不是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
}
}
可以防止这种行为吗?嗯,您可以注册一个(来自),但这似乎需要做很多工作。:)如果是我,我将忽略方法签名中的声明
@RequestParam
,并使用传入的请求
对象解析值。我建议您尝试以下格式:
ingredients=egg&ingredients=milk&ingredients=butter
将&components
添加到末尾将处理数组只有一个值的情况
ingredients=egg&ingredients=milk&ingredients=butter&ingredients
ingredients=milk,skimmed&ingredients
额外的条目需要从数组中删除,使用列表将使这更容易
或者,如果您正试图实现一个REST控制器来直接通过管道进入数据库,那么您应该看看。这是一个例子
基本上,您可以使用@RepositoryRestResource
注释您的存储库,而spring将完成其余的工作:)一个来自
这适用于包含逗号的单个成分的情况。请求参数到方法参数的路径经过参数值提取,然后进行参数值转换。现在发生的是:
提取:
参数为。这可能是为了允许将简单属性作为简单字符串值传递给以后的值转换
转换:
Spring用于值转换。在默认设置中,它不幸地将字符串作为逗号分隔的列表处理
该做什么:
您对Spring处理单值请求参数的方式非常反感。因此,我将手动进行绑定:
// Method annotations
public HttpEntity<CustomOutputObject> handlerMethod(WebRequest request) {
String[] ingredients = request.getParameterValues("ingredients");
// Do other stuff
}
//方法注释
公共HttpEntity handlerMethod(WebRequest){
字符串[]成分=request.getParameterValues(“成分”);
//做其他事情
}
你也可以查一下。。以及。尝试在操作方法中获取请求查询字符串。你是怎么运作的?我猜应用服务器可能正在为您解码url。很好,我已经编辑了问题并添加了相关信息。谢谢。看这里。我会首先尝试解决这个问题。如果您只关注spring在绑定到数组时以逗号分隔查询参数这一事实,就可以简化这个问题并实现这一点。查询编码/空格似乎无关紧要。我遇到的问题是,成分
参数中可能有一个逗号,它们不像鸡蛋
或牛奶
那样简单,它们像1/4杯意大利乳清干酪、酸奶
一样“复杂”,需要被视为独特的成分(在这里,你不会看到乳清干酪
,酸奶
作为两种不同的成分)我制作了一个快速测试应用程序,http://localhost:8080/?list=egg&list=milk,%20skimed&list=butter
结果为{“鸡蛋”、“脱脂牛奶”、“黄油”}
。您试过了吗?我现在的情况是,我只有一个配料数组元素,至少与“脱脂牛奶”
”一样复杂,预计将作为一个包含1个元素的数组进行处理,而我将处理2个元素,使用逗号,
作为分隔符。我尝试了以下操作,但未成功:(当有一个配料的实例时,它看起来像是反序列化为csv,但当您添加多个实例时,每个实例都成为数组中的一个值。我看到问题了,在末尾添加一个空的&配料
然后将其删除如何?配料=牛奶、脱脂和配料
,然后在控制器中使用列出配料
和配料。删除(配料.size()-1)
感谢您提供有关逗号的详细信息!我已使用HttpServletRequest
和getQueryString()解决了它
然后用纯逗号,
作为分隔符拆分编码的字符串,然后安全地解码数组的每个字符串(即使它包含逗号)。
ingredients=egg&ingredients=milk&ingredients=butter
ingredients=egg&ingredients=milk&ingredients=butter&ingredients
ingredients=milk,skimmed&ingredients
public String get(WebRequest req) {
String[] ingredients = req.getParameterValues("ingredients");
for(String ingredient:ingredients ) {
System.out.println(ingredient);
}
...
}
// Method annotations
public HttpEntity<CustomOutputObject> handlerMethod(WebRequest request) {
String[] ingredients = request.getParameterValues("ingredients");
// Do other stuff
}