En HttpServletRequest , getParameterMap
devuelve un mapa de todos los parámetros de cadena de consulta y parámetros de datos de publicación.
¿Hay alguna forma de obtener un mapa de SOLO parámetros de cadena de consulta? Estoy tratando de evitar usar getQueryString y analizar los valores.
java
servlets
query-string
JasonStoltz
fuente
fuente
Respuestas:
Al contrario de lo que dijo cularis, puede haber ambos en el mapa de parámetros.
La mejor manera que veo es utilizar el mapa de parámetros como proxy y, para cada recuperación de parámetro, verificar si queryString contiene "&? <parameterName> =".
Tenga en cuenta que parameterName debe estar codificado en URL antes de que se pueda realizar esta verificación, como señaló Qerub.
Eso le ahorra el análisis y aún le brinda solo parámetros de URL.
fuente
parameterName
debe estar codificado en URL antes de que se pueda realizar esta verificación.?
. Ese es el carácter separador entre URI y cadena de consulta.Puede usar
request.getQueryString()
, si la cadena de consulta es comoPara obtener un nombre, puedes hacer esto
request.getParameter("username");
fuente
La API del servlet carece de esta característica porque se creó en un momento en que muchos creían que la cadena de consulta y el cuerpo del mensaje eran solo dos formas diferentes de enviar parámetros, sin darse cuenta de que los propósitos de los parámetros son fundamentalmente diferentes.
Los parámetros de la cadena de consulta? Foo = bar son parte de la URL porque están involucrados en la identificación de un recurso (que podría ser una colección de muchos recursos), como "todas las personas de 42 años":
GET / personas? Edad = 42
Los parámetros del cuerpo del mensaje en POST o PUT están ahí para expresar una modificación a los recursos de destino. Fx estableciendo un valor para el atributo "cabello":
PUT / personas? Edad = 42
cabello = gris
Por lo tanto, definitivamente es RESTful usar los parámetros de consulta y los parámetros del cuerpo al mismo tiempo, separados para que pueda usarlos para diferentes propósitos. La característica definitivamente falta en la API de servlet de Java.
fuente
Como dicen las otras respuestas, no hay forma de obtener parámetros de cadena de consulta usando la API de servlet.
Entonces, creo que la mejor manera de obtener parámetros de consulta es analizar la cadena de consulta usted mismo. (Es más complicado iterar sobre los parámetros y verificar si la cadena de consulta contiene el parámetro)
Escribí el siguiente código para obtener los parámetros de la cadena de consulta. Usando apache StringUtils y ArrayUtils que también admite valores de parámetros de consulta separados por CSV.
Ejemplo:
username=james&username=smith&password=pwd1,pwd2
volverápassword : [pwd1, pwd2]
(longitud = 2)username : [james, smith]
(longitud = 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; }
fuente
&
carácter en su valor, si le dará el resultado correctoURLDecoder.decode(keyValuePair[0])
(o[1]
) también: docs.oracle.com/javase/6/docs/api/java/net/URLDecoder.htmlusername=james&username=smith&password=pwd1,pwd2
tendrá un mapa con 2 valores para el nombre de usuario (que es correcto) pero solo 1 valor para la contraseña (que es incorrecta)Java 8
return Collections.list(httpServletRequest.getParameterNames()) .stream() .collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));
fuente
Me temo que no hay forma de analizar los parámetros de la cadena de consulta por separado de los parámetros de la publicación. Por cierto, el hecho de que dicha API esté ausente puede significar que probablemente debería verificar su diseño. ¿Por qué utiliza una cadena de consulta al enviar POST? Si realmente desea enviar más datos a la URL, use una convención similar a REST, por ejemplo, en lugar de enviar
http://mycompany.com/myapp/myservlet?first=11&second=22
decir:
http://mycompany.com/myapp/myservlet/11/22
fuente