在我的应用程序中,我必须提取请求的参数,并按照它们在查询字符串中的出现顺序放入集合中。
例如,如果发件人发出以下请求,
http://myapp.com/myrequest?param3=value3¶m2=value2¶m1=value1,
我需要生成一个集合,其中的元素按以下顺序放置:param3,param2,param1。
为实现这一目标,我首先使用下面显示的方法getParameterNames
提取参数名称。
private List<String> getParameterNames(HttpServletRequest aRequest)
throws IOException {
final List<String> parameterNames = new LinkedList<>();
final BufferedReader reader = aRequest.getReader();
final String queryString = IOUtils.toString(reader);
final String[] parameterValuePairs = queryString.split("&");
for (String parameterValuePair : parameterValuePairs) {
final String[] nameValueArray = parameterValuePair.split("=");
parameterNames.add(nameValueArray[0]);
}
return parameterNames;
}
问题:在调用此方法后,aRequest.getParameterValue(...)
会为参数名称返回null
。
如果我这样做 - 首先保存参数图,然后调用getParameterNames
,然后其结果为空。
final Map<String,String[]> parameterMap = aRequest.getParameterMap();
final List<String> parameterNames = getParameterNames(aRequest);
我尝试了以下事项:
reader.close()
中没有调用getParameterNames
(我在其他地方读到这可能会导致问题)。reader.reset()
。这一切都没有帮助。
如何从HttpServletRequest
获取参数值对的列表,该列表按参数在查询字符串中的外观排序?
答案 0 :(得分:0)
使用第一种方法,您无需使用Reader
来获取参数。而是做:
final List<String> parameterNames = new LinkedList<>();
final String queryString = query.getQueryString(); // get query string from query itself
// rest of your code stays unchanged
它不起作用的原因是因为请求输入流中的数据只能读取一次。
或者,如果我错了,情况并非如此,您可以将参数及其值保存到LinkedHashMap:
final LinkedHashMap<String, String> parameterValues = new LinkedHashMap<>();
final BufferedReader reader = aRequest.getReader();
final String queryString = IOUtils.toString(reader);
final String[] parameterValuePairs = queryString.split("&");
for (String parameterValuePair : parameterValuePairs) {
final String[] nameValueArray = parameterValuePair.split("=");
parameterValues.put(nameValueArray[0], nameValueArray[1]);
}
现在parameterValues
是一个地图,其中的条目按照出现顺序排序。