¿Cómo se codifican los parámetros de consulta para ir a una URL en Java? Lo sé, esto parece una pregunta obvia y ya hecha.
Hay dos sutilezas de las que no estoy seguro:
- ¿Deben codificarse los espacios en la URL como "+" o como "% 20"? En Chrome, si escribo "http://google.com/foo=?bar me", Chrome lo cambia para que se codifique con% 20
- ¿Es necesario / correcto codificar los dos puntos ":" como% 3B? Chrome no lo hace.
Notas:
java.net.URLEncoder.encode
no parece funcionar, parece ser para que los datos de codificación se envíen desde el formulario. Por ejemplo, codifica espacio como en+
lugar de%20
y codifica dos puntos que no es necesario.java.net.URI
no codifica parámetros de consulta
application/x-www-form-urlencoded
pares clave / valor. Vea aquí para más información: illegalargumentexception.blogspot.com/2009/12/…Respuestas:
java.net.URLEncoder.encode(String s, String encoding)
también puede ayudar. Sigue la codificación del formulario HTMLapplication/x-www-form-urlencoded
.Por otro lado, la codificación porcentual (también conocida como codificación de URL ) codifica el espacio con
%20
. Los:
dos puntos son un carácter reservado, por lo que seguirán siendo dos puntos después de la codificación.fuente
URLEncoder
se ajusta alapplication/x-www-form-urlencoded
formato MIME (que es una codificación de formulario HTML válida). Supongo que eso no es lo que estás buscando.http://example.com/?url=http://example.com/?q=c&sort=name
. ¿Debería codificar&sort=name
o no? No hay forma de distinguir el valor de la URL. Esa es la razón exacta por la que necesita la codificación de valores en primer lugar.EDITAR:
URIUtil
ya no está disponible en versiones más recientes, mejor respuesta en Java - codificar URL o por Mr. Sindi en este hilo.URIUtil
de Apache httpclient es realmente útil, aunque existen algunas alternativasAmbos son perfectamente válidos en el contexto adecuado . Aunque si realmente lo prefiere, puede emitir un reemplazo de cadena.
fuente
URIUtil.encodeWithinQuery
es lo que usaría para codificar un parámetro de consulta individual, que es lo que parecía estar preguntando la pregunta original.Desafortunadamente, URLEncoder.encode () no produce una codificación de porcentaje válida (como se especifica en RFC 3986 ).
URLEncoder.encode () codifica todo muy bien, excepto que el espacio está codificado en "+". Todos los codificadores URI de Java que pude encontrar solo exponen métodos públicos para codificar la consulta, el fragmento, las partes de la ruta, etc., pero no exponga la codificación "cruda". Esto es lamentable, ya que se permite que el fragmento y la consulta codifiquen el espacio en +, por lo que no queremos usarlos. La ruta está codificada correctamente, pero primero se "normaliza", por lo que tampoco podemos usarla para la codificación "genérica".
La mejor solución que se me ocurrió:
Si
replaceAll()
es demasiado lento para ti, supongo que la alternativa es rodar tu propio codificador ...EDITAR: Primero tenía este código aquí que no codifica "?", "&", "=" Correctamente:
fuente
+
es una codificación perfectamente válida de un espacio.+
se puede interpretar incorrectamente; eche un vistazo a C # blogs.msdn.microsoft.com/yangxind/2006/11/08/…encodeURIComponent
salida del método de Javascript , y esta fue la única coincidencia exacta para las que probé (consultas con espacios, caracteres especiales turcos y alemanes).No es necesario codificar dos puntos como% 3B en la consulta, aunque hacerlo no es ilegal.
También parece que solo los espacios codificados por porcentaje son válidos, ya que dudo que el espacio sea un ALPHA o un DÍGITO
consulte la especificación de URI para obtener más detalles.
fuente
application/x-www-form-urlencoded
cadena de consulta, cualquiera de las dos está bien. Si está arreglando una URL que el usuario escribió / pegó,:
debe dejarlo solo.El URLEncoder de Java integrado está haciendo lo que se supone que debe hacer, y debería usarlo.
Un "+" o "% 20" son ambos reemplazos válidos para un carácter de espacio en una URL. Cualquiera de los dos funcionará.
Un ":" debe estar codificado, ya que es un carácter separador. es decir, http: // foo o ftp: // bar . El hecho de que un navegador en particular pueda manejarlo cuando no está codificado no lo hace correcto. Deberías codificarlos.
Como una buena práctica, asegúrese de utilizar el método que toma un parámetro de codificación de caracteres. UTF-8 generalmente se usa allí, pero debe proporcionarlo explícitamente.
fuente
+
es solo una representación del espacio enapplication/x-www-form-urlencoded
; no se garantiza que funcione incluso cuando está restringido a HTTP. De manera similar,:
es válido en una cadena de consulta y no debe convertirse a%3B
; un servidor puede optar por interpretarlos de manera diferente.http://
de lohttp%3A%2F%2F
que no es correctohttp://
pieza. El método es para parámetros de consulta y datos de formulario codificados. Sin embargo, si desea pasar la URL de otro sitio web como parámetro de consulta, ENTONCES querrá codificarlo para evitar confundir el analizador de URL.application/x-www-form-urlencoded
tipo de contenido. ¿No significa eso que debe funcionar para HTTP?si solo tiene un problema de espacio en la URL. He usado el siguiente código y funciona bien
ejemplo: la URL es
entonces la salida de muUrl es
fuente
Observé en caso de que Datetime (Timestamp)
URLEncoder.encode(param,"UTF-8")
no funcione.fuente