在HttpServletRequest中,getParameterMap
返回所有查询字符串参数和post数据参数的Map。
有没有办法获取仅查询字符串参数的映射?我试图避免使用getQueryString并解析出值。
在HttpServletRequest中,getParameterMap
返回所有查询字符串参数和post数据参数的Map。
有没有办法获取仅查询字符串参数的映射?我试图避免使用getQueryString并解析出值。
Answers:
与cularis所说的相反,参数图中可能同时存在两者。
我认为最好的方法是代理parameterMap并为每个参数检索检查queryString是否包含“&?<parameterName> =”。
请注意,如Qerub所指出的,在进行此检查之前,必须对parameterName进行URL编码。
这样可以节省您的分析,但仍然只提供URL参数。
parameterName
必须先对网址进行编码,然后才能进行此检查。
?
。那是URI和查询字符串之间的分隔符。
您可以使用request.getQueryString()
,如果查询字符串是像
username=james&password=pwd
要获得名称,您可以执行此操作
request.getParameter("username");
Servlet API缺少此功能,因为它是在许多人认为查询字符串和消息正文只是发送参数的两种不同方式时创建的,而不是意识到参数的用途根本不同。
查询字符串参数?foo = bar是URL的一部分,因为它们涉及标识资源(可能是许多资源的集合),例如“所有42岁的人”:
GET /人?年龄= 42
POST或PUT中的消息正文参数在那里表示对目标资源的修改。Fx为属性“ hair”设置值:
PUT /人?年龄= 42
头发=灰色
因此,绝对可以同时使用查询参数和主体参数,并将它们分开使用,以实现不同的用途,这是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;
}
&
的值中都包含字符,它是否会为您提供正确的结果
URLDecoder.decode(keyValuePair[0])
(或[1]
):docs.oracle.com/javase/6/docs/api/java/net/URLDecoder.html
username=james&username=smith&password=pwd1,pwd2
将有一个包含2个用户名值(正确)但只有1个密码值(不正确)的地图
Java 8
return Collections.list(httpServletRequest.getParameterNames())
.stream()
.collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
恐怕没有办法将查询字符串参数与post参数分开解析。顺便说一句,缺少此类API可能意味着您应该检查设计。为什么在发送POST时使用查询字符串?如果您确实想将更多数据发送到URL,请使用类似REST的约定,例如,而不是发送
http://mycompany.com/myapp/myservlet?first=11&second=22
说: