Java EE tiene ServletRequest.getParameterValues () .
En plataformas que no son EE, URL.getQuery () simplemente devuelve una cadena.
¿Cuál es la forma normal de analizar correctamente la cadena de consulta en una URL cuando no está en Java EE?
< despotricar >
Es popular en las respuestas intentar hacer su propio analizador. Este es un proyecto de microcodificación muy interesante y emocionante, pero no puedo decir que sea una buena idea :(
Los fragmentos de código a continuación son generalmente defectuosos o rotos, por cierto. Romperlos es un ejercicio interesante para el lector. Y a los piratas informáticos que atacan los sitios web que los utilizan .
Analizar cadenas de consulta es un problema bien definido, pero leer las especificaciones y comprender los matices no es trivial. ¡Es mucho mejor dejar que un codificador de la biblioteca de la plataforma haga el trabajo duro y arregle el problema por usted!
< / rant >
getQuery()
y qué desea obtener como salida?ServletRequest
.Respuestas:
Desde Android M las cosas se han vuelto más complicadas. La respuesta de android.net.URI .getQueryParameter () tiene un error que rompe espacios antes de JellyBean. Apache URLEncodedUtils.parse () trabajó, pero fue en desuso en L , y elimina en M .
Entonces la mejor respuesta ahora es UrlQuerySanitizer . Esto ha existido desde el nivel 1 de API y todavía existe. También te hace pensar en cuestiones difíciles como cómo manejas caracteres especiales o valores repetidos.
El código más simple es
Si está satisfecho con el comportamiento de análisis predeterminado, puede hacer lo siguiente:
pero debe asegurarse de comprender cuál es el comportamiento de análisis predeterminado, ya que podría no ser lo que desea.
fuente
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(YourStringURL);
String value = sanitizer.getValue("parameter");
UrlQuerySanitizer
en sdk-23 solo tiene un métodosanitize()
_
. Tuve que ir con stackoverflow.com/a/35638979/1155282En Android:
fuente
En Android, las bibliotecas de Apache proporcionan un analizador de consultas:
http://developer.android.com/reference/org/apache/http/client/utils/URLEncodedUtils.html y http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/ http / client / utils / URLEncodedUtils.html
fuente
URLEncodedUtils.parse()
devuelve unList
que luego tendría que recorrer para encontrar el valor de una clave específica. Sería mucho mejor si devolviera un meMap
gusta en la respuesta de BalusC.are
lo tanto, son realmente útiles. Simplemente ver algunas sugerencias sobre lo que podría estar mal con el código ya es una gran ayuda para pensar por mí mismo. Y fíjate, no quise decir "rodar el tuyo es mejor", sino que es bueno tener un buen material para una decisión informada en mi propio código.Aquí está la respuesta de BalusC , pero compila y devuelve resultados:
fuente
String pair[] = param.split("=");
enString pair[] = param.split("=", 2);
dividir la clave = valor par sólo en la primera ocurrencia. Creo que está permitido tener signos iguales sin codificar en el valor.Si tiene librerías jetty (servidor o cliente) en su classpath, puede usar las clases jetty util (consulte javadoc ), por ejemplo:
fuente
Si está utilizando Spring 3.1 o superior (vaya, esperaba que el soporte retrocediera más), puede usar
UriComponents
yUriComponentsBuilder
:components.getQueryParams()
devuelve unMultiValueMap<String, String>
Aquí hay más documentación .
fuente
Para un servlet o una página JSP, puede obtener pares clave / valor de cadena de consulta utilizando request.getParameter ("paramname")
Hay otras formas de hacerlo, pero así es como lo hago en todos los servlets y páginas jsp que creo.
fuente
En Android, traté de usar la respuesta @diyism pero encontré el problema de caracteres espaciales planteado por @rpetrich, por ejemplo: lleno un formulario donde
username = "us+us"
y hagopassword = "pw pw"
que una cadena de URL se vea así:Sin embargo, el código @diyism regresa
"us+us"
y"pw+pw"
, es decir, no detecta el carácter de espacio. Si la URL se reescribió con%20
el carácter de espacio se identifica:Esto lleva a la siguiente solución:
fuente
replace(" ", "%20")
Esto se siente mal. Pero hizo el truco para mí: DAnalizar la cadena de consulta es un poco más complicado de lo que parece, dependiendo de cuán indulgente quieras ser.
Primero, la cadena de consulta son bytes ascii. Usted lee estos bytes uno a la vez y los convierte en caracteres. Si el personaje es? o & luego indica el inicio de un nombre de parámetro. Si el carácter es =, entonces señala el inicio de un valor de parámetro. Si el carácter es%, indica el inicio de un byte codificado. Aquí es donde se pone difícil.
Cuando lee en un% char, debe leer los siguientes dos bytes e interpretarlos como dígitos hexadecimales. Eso significa que los siguientes dos bytes serán 0-9, af o AF. Pegue estos dos dígitos hexadecimales para obtener su valor de byte. Pero recuerda, los bytes no son caracteres . Debe saber qué codificación se usó para codificar los caracteres. El carácter é no codifica lo mismo en UTF-8 que en ISO-8859-1. En general, es imposible saber qué codificación se usó para un conjunto de caracteres dado. Siempre uso UTF-8 porque mi sitio web está configurado para servir siempre todo usando UTF-8, pero en la práctica no puede estar seguro. Algunos agentes de usuario le indicarán la codificación de caracteres en la solicitud; puede intentar leer eso si tiene una solicitud HTTP completa. Si solo tienes una url aislada, buena suerte.
De todos modos, suponiendo que está utilizando UTF-8 o alguna otra codificación de caracteres de varios bytes, ahora que ha decodificado un byte codificado, debe dejarlo a un lado hasta que capture el siguiente byte. Necesita todos los bytes codificados que están juntos porque no puede decodificar url correctamente un byte a la vez. Ponga a un lado todos los bytes que están juntos y luego descifrelos todos a la vez para reconstruir su personaje.
Además, se vuelve más divertido si quieres ser indulgente y tener en cuenta a los agentes de usuario que destruyen las URL. Por ejemplo, algunos clientes de correo web codifican dos cosas. O duplique los caracteres? & = (Por ejemplo:)
http://yoursite.com/blah??p1==v1&&p2==v2
. Si desea tratar de resolverlo con gracia, deberá agregar más lógica a su analizador.fuente
En Android es simple como el código a continuación:
Además, si no desea registrar cada clave de consulta esperada, use:
Antes de llamar:
fuente
Tengo métodos para lograr esto:
1) :
2) y la forma más fácil de hacer esto usando la clase Uri :
y este es un ejemplo de cómo usar cualquiera de los dos métodos:
el valor de tagValue es
800
fuente
En Android, puede usar el método estático Uri.parse de la clase android.net.Uri para hacer el trabajo pesado. Si está haciendo algo con URI e Intentos, querrá usarlo de todos modos.
fuente
Solo como referencia, esto es con lo que terminé (basado en URLEncodedUtils, y devolviendo un Mapa).
caracteristicas:
request.getQueryString()
)Map
List<String>
Código:
Un asistente de compatibilidad (los valores se almacenan en una matriz de cadenas al igual que en ServletRequest.getParameterMap () ):
fuente
Esto funciona para mí. No estoy seguro de por qué todos buscaban un Mapa, Lista> Todo lo que necesitaba era un simple nombre de valor Mapa.
Para simplificar las cosas, utilicé la compilación en URI.getQuery ();
fuente
El multimapa de guayaba es más adecuado para esto. Aquí hay una versión corta y limpia:
fuente
Apache AXIS2 tiene una implementación autónoma de QueryStringParser.java. Si no está utilizando Axis2, simplemente descargue el código fuente y el caso de prueba desde aquí:
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/src/org/apache/axis2/transport/http/util/QueryStringParser.java
http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/modules/kernel/test/org/apache/axis2/transport/http/util/QueryStringParserTest.java
fuente
Originalmente respondido aquí
En Android, hay una clase Uri en el paquete android.net . Tenga en cuenta que Uri es parte de android.net, mientras que URI es parte de java.net.
La clase Uri tiene muchas funciones para extraer pares de clave-valor de consulta.
La siguiente función devuelve pares clave-valor en forma de HashMap.
En Java:
En Kotlin:
fuente
No creo que haya uno en JRE. Puede encontrar funciones similares en otros paquetes como Apache HttpClient. Si no utiliza ningún otro paquete, solo tiene que escribir el suyo. No es tan dificil. Esto es lo que uso
fuente
Basado en la respuesta de BalusC, escribí un código Java de ejemplo:
fuente
fuente
Use Apache HttpComponents y conéctelo con algún código de colección para acceder a los parámetros por valor: http://www.joelgerard.com/2012/09/14/parsing-query-strings-in-java-and-accessing-values-by -llave/
fuente
usando guayaba:
fuente
Respondiendo aquí porque este es un hilo popular. Esta es una solución limpia en Kotlin que utiliza la
UrlQuerySanitizer
API recomendada . Ver la documentación oficial . He agregado un generador de cadenas para concatenar y mostrar los parámetros.fuente
este método toma la uri y el mapa de retorno del nombre y valor nominal
fuente
Dices "Java" pero "no Java EE". ¿Quiere decir que está utilizando JSP y / o servlets pero no una pila Java EE completa? Si ese es el caso, entonces aún debería tener request.getParameter () disponible para usted.
Si quiere decir que está escribiendo Java pero no está escribiendo JSP ni servlets, o que solo está utilizando Java como punto de referencia, pero está en otra plataforma que no tiene un análisis de parámetros incorporado ... Wow , eso suena como una pregunta poco probable, pero si es así, el principio sería:
(Podría escribir código Java, pero eso no tendría sentido, porque si tiene Java disponible, puede usar request.getParameters).
fuente