Digamos que tengo una URL
http://example.com/query?q=
y tengo una consulta ingresada por el usuario como:
palabra al azar £ 500 banco $
Quiero que el resultado sea una URL correctamente codificada:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
¿Cuál es la mejor manera de lograr esto? Traté de URLEncoder
crear objetos URI / URL pero ninguno de ellos salió del todo bien.
Respuestas:
URLEncoder
Es el camino a seguir. Solo debe tener en cuenta para codificar solo el nombre y / o el valor del parámetro de la cadena de consulta individual, no la URL completa, con seguridad no el carácter separador del parámetro de la cadena de consulta&
ni el carácter separador de nombre-valor del parámetro=
.Tenga en cuenta que los espacios en los parámetros de consulta están representados por
+
, no%20
, que es legítimamente válido. El%20
suele usarse para representar espacios en URI en sí (la parte antes del carácter URI-consulta cadena de separación?
), no en cadena de consulta (la parte que sigue?
).También tenga en cuenta que hay tres
encode()
métodos. Uno sin unCharset
segundo argumento y otro con unString
segundo argumento que arroja una excepción marcada. El que no tieneCharset
argumento está en desuso. Nunca lo use y siempre especifique elCharset
argumento. El javadoc incluso recomienda explícitamente utilizar la codificación UTF-8, según lo dispuesto por RFC3986 y W3C .Ver también:
fuente
URLEncoder
es para parámetros de consulta codificados en URL que cumplen con lasapplication/x-www-form-urlencoded
reglas. Los parámetros de ruta no encajan en esta categoría. Necesita un codificador URI en su lugar.No lo usaría
URLEncoder
. Además de ser nombrado incorrectamente (URLEncoder
no tiene nada que ver con las URL), ineficiente (utiliza unStringBuffer
lugar de Builder y hace un par de otras cosas que son lentas) También es demasiado fácil arruinarlo.En cambio, usaría
URIBuilder
o primavera delorg.springframework.web.util.UriUtils.encodeQuery
o de los Comunes ApacheHttpClient
. La razón es que tiene que escapar del nombre de los parámetros de consulta (es decir, la respuesta de BalusCq
) de manera diferente al valor del parámetro.El único inconveniente de lo anterior (que descubrí dolorosamente) es que las URL no son un verdadero subconjunto de URI .
Código de muestra:
Como solo estoy enlazando a otras respuestas, marqué esto como wiki comunitario. Siéntase libre de editar.
fuente
URLEncoder
es como su javadoc dice que tiene la intención de codificar los parámetros de la cadena de consulta conforme aapplication/x-www-form-urlencoded
lo descrito en la especificación HTML: w3.org/TR/html4/interact/… . Algunos usuarios lo confunden / abusan para codificar URI completos, como aparentemente hizo el respondedor actual.Primero debe crear un URI como:
Luego convierta ese Uri a una cadena ASCII:
Ahora su cadena de url está completamente codificada, primero hicimos una codificación de url simple y luego la convertimos en una cadena ASCII para asegurarnos de que ningún carácter fuera de US-ASCII permanezca en la cadena. Así es exactamente como lo hacen los navegadores.
fuente
URL.toURI()
no.+
reemplazo de espacios, pero aceptó el% 20, por lo que esta solución funcionó mejor que BalusC, ¡gracias!Guava 15 ahora ha agregado un conjunto de escapes de URL sencillos .
fuente
URLEncoder
.URLEncoder
no lo hace.La biblioteca Apache Http Components proporciona una opción ordenada para construir y codificar parámetros de consulta:
Con el uso de HttpComponents 4.x - URLEncodedUtils
Para el uso de HttpClient 3.x - EncodingUtil
fuente
Aquí hay un método que puede usar en su código para convertir una cadena de url y un mapa de parámetros en una cadena de url codificada válida que contenga los parámetros de consulta.
fuente
Huellas dactilares
¿Que está sucediendo aquí?
1. Dividir URL en partes estructurales. Úselo
java.net.URL
para ello.2. ¡ Codifique cada parte estructural correctamente!
3. Use
IDN.toASCII(putDomainNameHere)
para codificar Punycode el nombre del host!4. Utilícelo
java.net.URI.toASCIIString()
para codificar en porcentaje, unicode codificado con NFC - (¡mejor sería NFKC!). Para obtener más información, consulte: Cómo codificar correctamente esta URLEn algunos casos es aconsejable verificar si la url ya está codificada . También reemplace los espacios codificados '+' con espacios codificados '% 20'.
Aquí hay algunos ejemplos que también funcionarán correctamente.
La solución pasa alrededor de 100 de los casos de prueba proporcionados por Web Plattform Tests .
fuente
En Android usaría este código:
Donde
Uri
es unandroid.net.Uri
fuente
En mi caso, solo necesitaba pasar la url completa y codificar solo el valor de cada parámetro. No encontré un código común para hacerlo (¡!!) así que creé este pequeño método para hacer el trabajo:
Utiliza org.apache.commons.lang3.StringUtils
fuente
Puede usar el siguiente código.
fuente
=
y&
, lo que no es correcto.