在HttpServletRequest中,
有没有一种方法只获取查询字符串参数的映射?我想避免使用getQueryString并解析值。
getParameterMap
返回一个包含所有查询字符串参数和POST数据参数的映射。有没有一种方法只获取查询字符串参数的映射?我想避免使用getQueryString并解析值。
getParameterMap
返回一个包含所有查询字符串参数和POST数据参数的映射。如果查询字符串类似于,您可以使用request.getQueryString()
。
username=james&password=pwd
要获取名称,您可以这样做
request.getParameter("username");
与cularis所说的不同,参数映射中可能存在两者。
我认为最好的方法是代理parameterMap,并对于每个参数检索检查queryString是否包含"&?<parameterName>="。
请注意,在进行此检查之前,需要对parameterName进行URL编码,如Qerub所指出的那样。
这样可以节省解析过程,同时仍然只提供URL参数。
parameterName
进行 URL 编码。 - qerub?
。这是URI和查询字符串之间的分隔符。 - BalusC?foo=bar
是URL的一部分,因为它们涉及标识资源(可能是许多资源的集合),例如“所有年龄为42岁的人”:GET /persons?age=42
,POST或PUT中的消息正文参数用于表达对目标资源的修改,例如将值设置为属性“hair”:PUT /persons?age=42
hair=grey
,因此同时使用查询参数和正文参数是符合RESTful的,将它们分开以便用于不同的目的。Java Servlet API确实缺少此功能。如其他答案所述,使用servlet api无法获取查询字符串参数。
因此,我认为最好的方法是自己解析查询参数。(迭代参数并检查查询字符串是否包含参数更加复杂)
我编写了下面的代码来获取查询字符串参数。使用支持CSV分隔查询参数值的apache StringUtils和ArrayUtils。
示例:username=james&username=smith&password=pwd1,pwd2
将返回
password: [pwd1, pwd2]
(长度为2)
username: [james, smith]
(长度为2)
public static Map<String, String[]> getQueryParameters(HttpServletRequest request) throws UnsupportedEncodingException {
Map<String, String[]> queryParameters = new HashMap<>();
String queryString = request.getQueryString();
if (StringUtils.isNotEmpty(queryString)) {
queryString = URLDecoder.decode(queryString, StandardCharsets.UTF_8.toString());
String[] parameters = queryString.split("&");
for (String parameter : parameters) {
String[] keyValuePair = parameter.split("=");
String[] values = queryParameters.get(keyValuePair[0]);
//length is one if no value is available.
values = keyValuePair.length == 1 ? ArrayUtils.add(values, "") :
ArrayUtils.addAll(values, keyValuePair[1].split(",")); //handles CSV separated query param values.
queryParameters.put(keyValuePair[0], values);
}
}
return queryParameters;
}
&
字符,是否会给您正确的结果。 - amdgURLDecoder.decode(keyValuePair[0])
(或 [1]
):https://docs.oracle.com/javase/6/docs/api/java/net/URLDecoder.html - Plutousername=james&username=smith&password=pwd1,pwd2
将会生成一个包含两个username值的映射(正确的),但只有一个password值的映射(错误的)。 - NivJava 8
return Collections.list(httpServletRequest.getParameterNames())
.stream()
.collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
httpServletRequest.getParameterMap()
就足够了。 - Unmitigated