example - uri java
¿Cómo(correctamente) crear una URL mailto(URI) en Java? (3)
¿Tienes que codificar / escapar manualmente el porcentaje ?
y &
.
String email2 = "/"()<>[]:,;@///"!#$%&''*+-/=?^_`{}| ~.a/"@example.org";
String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26");
¿Entonces parece que el ?
y los símbolos &
no se están escapando correctamente en el URI. ¿Algo después de la ?
se ignora en el URI porque ese símbolo está reservado para "cadenas de consulta" en las URL. Referencia here .
De acuerdo con this y los documentos de referencia, necesitamos escapar &
también. Por alguna razón, Java no está haciendo eso por nosotros. De hecho, RFC 6068 incluso afirma:
Un número de caracteres que pueden aparecer en DEBE estar codificado en porcentaje. Estos son los caracteres que no pueden aparecer en un URI según [STD66] así como "%" (porque se usa para codificación en porcentaje) y todos los caracteres en gen-delims excepto "@" y ":" (es decir, "/", "?", "#", "[", y "]"). De los caracteres en sub-delimitaciones, al menos lo siguiente también debe estar codificado en porcentaje: "&", ";" y "=".
La forma de solucionarlo (algo así como un truco, pero funciona) es escapar manualmente de estos caracteres utilizando un %
seguido de un valor hexadecimal ASCII de 2 dígitos para el símbolo. Haga referencia a this .
Probé pegando la cadena resultante en Chrome y abrí correctamente mi correo electrónico predeterminado con un correo electrónico a
"()<>[]:,; @/"!#$%&''*+-/=?^_`{}| ~.a"@example.org
Más investigación
Así que parece que la clase URI de Java utiliza RFC 2396 , que establece:
Si los datos para un componente de URI entran en conflicto con el propósito reservado, entonces los datos en conflicto deben escaparse antes de formar el URI.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
La clase de sintaxis "reservada" anterior se refiere a aquellos caracteres que están permitidos dentro de un URI, pero que pueden no estar permitidos dentro de un componente particular de la sintaxis URI genérica;
Dado:
String email1 = "[email protected]";
// legal email address according to wikipedia [1]
String email2 = "/"()<>[]:,;@///"!#$%&''*+-/=?^_`{}| ~.a/"@example.org";
¿Cuál es la mejor / forma correcta de crear un mailto: URI (en la forma de un objeto String)?
Lo intenté:
String uri = new URI("mailto", the_email_address, null).toString();
Esto es lo más cercano que obtuve, pero no codifica el signo de interrogación (?) En la parte local de la dirección de correo electrónico, pero de acuerdo con RFC 6068 debería hacerlo. También falla en ejemplos en el RFC, como "not@me"@example.org o [email protected] .
[1] Ejemplos de direcciones válidas
PD: Hay alguna información útil en ¿Debería estar codificado además en mailto: hipervínculos?
Me conformé con esto como una solución:
import org.apache.http.client.utils.URIBuilder;
// from Apache HttpClient
// maven group: org.apache.httpcomponents artifact: httpclient
String emailURL = new URIBuilder().setScheme("mailto").setPath(the_email_address).toString();
Probablemente desee utilizar el método estático URI.create (String uri) para crear su correo a uri, en lugar de usar el "nuevo" constructor. Por ejemplo, esto devuelve un URI válido (estoy usando jdk 7):
URI.create("mailto:[email protected]");
Espero que ayude.
Aclamaciones.
Tendrás que usar el constructor URI de Apache Commons
Se espera que el valor no se escape y puede contener caracteres que no sean ASCII.
No se puede utilizar directamente la clase de Java URI Java URI doc dice
Todos los caracteres de puntuación se reservan junto con los de la cadena "? / [] @" Están reservados .
La clase URI de Java utiliza RFC 2396 , que establece: Si los datos de un componente URI entran en conflicto con el propósito reservado, entonces los datos en conflicto deben escaparse antes de formar el URI.
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
Puede usar
java.net.URLEncoder
para codificar el nombre de usuario y luego usar el nombre de usuario codificado para crear laString uri = new URI("mailto", the_email_address, null).toString();
URIString uri = new URI("mailto", the_email_address, null).toString();
o
¿Puede manualmente el porcentaje de codificación / escape de la? y &.
String email2 = "/"()<>[]:,;@///"!#$%&''*+-/=?^_`{}| ~.a/"@example.org"; String uri2 = (new URI("mailto", email2, null)).toString().replace("?", "%3F").replace("&", "%26");
En JavaScript puedes usar la función
encodeURI()
. PHP tiene la funciónrawurlencode()
y ASP tiene laServer.URLEncode()
.