Tengo el URI como este:
https://google.com.ua/oauth/authorize?client_id=SS&response_type=code&scope=N_FULL&access_type=offline&redirect_uri=http://localhost/Callback
Necesito una colección con elementos analizados:
NAME VALUE
------------------------
client_id SS
response_type code
scope N_FULL
access_type offline
redirect_uri http://localhost/Callback
Para ser exactos, necesito un equivalente de Java para el método C # / .NET HttpUtility.ParseQueryString .
Por favor, dame un consejo sobre esto.
Gracias.
java
parsing
uri
namevaluecollection
Sergey Shafiev
fuente
fuente
java.net.URI
/java.net.URL
?Respuestas:
Si está buscando una manera de lograrlo sin usar una biblioteca externa, el siguiente código lo ayudará.
Puede acceder al Mapa devuelto utilizando
<map>.get("client_id")
, con la URL dada en su pregunta, esto devolvería "SS".ACTUALIZAR URL-Decodificación agregada
ACTUALIZACIÓN Como esta respuesta sigue siendo bastante popular, hice una versión mejorada del método anterior, que maneja múltiples parámetros con la misma clave y parámetros sin valor también.
ACTUALIZAR versión Java8
Ejecutando el método anterior con la URL
https://stackoverflow.com?param1=value1¶m2=¶m3=value3¶m3
devuelve este mapa:
fuente
org.apache.http.client.utils.URLEncodedUtils
es una biblioteca bien conocida que puede hacerlo por ti
Salidas
fuente
List<NameValuePair>
en unaMap<String,String>
de Java no tiene acceso a soporte para mapas de hash, se vería comomap.get("one")
si usted no sabe cómo hacerlo, debe ser otra pregunta (pero probarlo en su propia primera) . Preferimos mantener las preguntas escasas aquí en SOSystem.out.println(URLEncodedUtils.parse(new URI("http://example.com/?foo=bar&foo=baz"), "UTF-8"));
imprimirá [foo = bar, foo = baz] .URLEncodedUtils and
NameValuePair` ya no están disponibles (a menos que agregue una dependencia a la biblioteca Apache heredada como se describe aquí ).Si está utilizando Spring Framework:
Conseguirás:
fuente
UriComponentsBuilder.fromHttpUrl(url)
usa google guava y hazlo en 2 líneas:
que te da
fuente
uri
, debe usarlo,new java.net.URL(uri).getQuery()
ya que esto le da una validación de entrada gratuita en la URL.splitter.split()
que arrojaráIllegalArgumentException
si hay una clave duplicada en la cadena de consulta. Ver stackoverflow.com/questions/1746507/…La forma más corta que he encontrado es esta:
ACTUALIZACIÓN:
UriComponentsBuilder
proviene de la primavera. Aquí el enlace .fuente
Para Android, si está utilizando OkHttp en su proyecto. Puede echar un vistazo a esto. Es simple y útil.
fuente
Declaración de Java 8 one
Dada la URL para analizar:
Esta solución recopila una lista de pares:
Esta solución, por otro lado, recopila un mapa (dado que en una url puede haber más parámetros con el mismo nombre pero con valores diferentes).
Ambas soluciones deben usar una función de utilidad para decodificar adecuadamente los parámetros.
fuente
Si está utilizando servlet doGet intente esto
fuente
HttpServletRequest
y también funcionaMockHttpServletRequest
en las pruebas unitarias Mock MVC.Si está utilizando Java 8 y está dispuesto a escribir algunos métodos reutilizables, puede hacerlo en una línea.
Pero esa es una línea bastante brutal.
fuente
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 clave-valor de una consulta.
La siguiente función devuelve pares clave-valor en forma de HashMap.
En Java:
En Kotlin:
fuente
Utilizando los comentarios y soluciones mencionados anteriormente, estoy almacenando todos los parámetros de consulta usando Map <String, Object> donde los Objetos pueden ser string o Set <String>. La solución se da a continuación. Se recomienda utilizar algún tipo de validador de url para validar primero la url y luego llamar al método convertQueryStringToMap.
fuente
Probé una versión de Kotlin para ver cómo este es el mejor resultado en Google.
Y los métodos de extensión
fuente
Una solución lista para usar para la decodificación de la parte de consulta URI (incluida la decodificación y los valores de parámetros múltiples)
Comentarios
No estaba contento con el código provisto por @ Pr0gr4mm3r en https://stackoverflow.com/a/13592567/1211082 . La solución basada en Stream no hace URLDecoding, la versión mutable agrupada.
Así elaboré una solución que
Map<String, List<Optional<String>>>
Optional.empty()
lugar denull
)URLdecode
UnsupportedEncodingException
en una excepción de tiempo de ejecuciónRuntimeUnsupportedEncodingException
que permite la interacción con la transmisión. (Empaquetar la función regular en funciones que arrojan excepciones marcadas es una molestia. Y ScalaTry
no está disponible en el idioma predeterminado de Java).Código Java
Código Scala
... y en aras de la exhaustividad no puedo resistirme a proporcionar la solución en Scala que domina por brevedad y belleza
fuente
Solo una actualización de la versión Java 8
los métodos de mapeo y toList () deben usarse con los recopiladores que no se mencionaron en la respuesta principal. De lo contrario, arrojaría un error de compilación en IDE
fuente
splitQueryParameters()
método? ¿Y qué pasa con el**Collectors**
?Respuesta de Kotlin con referencia inicial de https://stackoverflow.com/a/51024552/3286489 , pero con una versión mejorada al ordenar los códigos y proporciona 2 versiones de la misma, y usar operaciones de colección inmutables
Use
java.net.URI
para extraer la consulta. Luego use las siguientes funciones de extensión proporcionadaspage2&page3
, obtendrá{page=3}
, use la función de extensión a continuaciónpage2&page3
, obtendrá{page=[2, 3]}
La forma de usarlo como a continuación
fuente
Netty también proporciona un buen analizador de cadenas de consulta llamado
QueryStringDecoder
. En una línea de código, puede analizar la URL en la pregunta. Me gusta porque no requiere atrapar o tirarjava.net.MalformedURLException
.En una linea:
Ver javadocs aquí: https://netty.io/4.1/api/io/netty/handler/codec/http/QueryStringDecoder.html
Aquí hay un ejemplo corto, autónomo y correcto:
que genera
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
Aquí está mi solución con reduce y Opcional :
Optional<SimpleImmutableEntry<String, String>>
de ignorar la basura más tardeEn caso de que pregunte, reduce requiere este combinador extraño en el último parámetro, que solo se usa en flujos paralelos. Su objetivo es fusionar dos resultados intermedios (aquí HashMap).
fuente
Si está utilizando Spring, agregue un argumento de tipo
@RequestParam Map<String,String>
a su método de controlador, ¡y Spring construirá el mapa por usted!fuente