2010-07-20 11 views
277

¿Cómo se codifica un URL en Android?Codificación URL en Android

pensé que era así:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8"); 
URL url = new URL(encodedURL); 

Si hago lo anterior, el http:// en urlAsString se sustituye por http%3A%2F%2F en encodedURL y cuando me siento un java.net.MalformedURLException cuando se utiliza la URL.

Respuesta

552

No codifica la URL completa, solo partes de ella que provienen de "fuentes no confiables".

String query = URLEncoder.encode("apples oranges", "utf-8"); 
String url = "http://stackoverflow.com/search?q=" + query; 

Como alternativa, puede utilizar Strings.urlEncode(String str) de DroidParts que no lanza excepciones comprobadas.

O usar algo como

String uri = Uri.parse("http://...") 
       .buildUpon() 
       .appendQueryParameter("key", "val") 
       .build().toString(); 
+1

¿Qué pasa si la URL completa no es confiable? ¿Debería codificar todo excepto el protocolo? Esperaba un método de conveniencia para hacer esto. – hpique

+4

Entonces es solo una URL rota. La idea es evitar que la parte de la consulta rompa la url. – yanchenko

+5

@hgpc: mira la sección 3 de RFC3986 (http://tools.ietf.org/html/rfc3986#section-3). Le dice cómo codificar las diversas partes de un URI. Desafortunadamente, cada parte del URI (host, ruta, consulta, etc.) tiene reglas de codificación ligeramente diferentes. –

154

voy a añadir una sugerencia aquí. Puede hacer esto, lo que evita tener que obtener bibliotecas externas.

seguirlo:

String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4"; 
URL url = new URL(urlStr); 
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 
url = uri.toURL(); 

Se puede ver que en esta URL en particular, necesito tener esos espacios codificados de modo que pueda usarlo para una solicitud.

Esto aprovecha un par de funciones disponibles para usted en las clases de Android. En primer lugar, la clase de URL puede dividir una url en sus componentes adecuados, por lo que no es necesario que realice ningún trabajo de búsqueda/reemplazo de cadenas. En segundo lugar, este enfoque aprovecha la característica de clase URI de escapes adecuados de componentes cuando se construye un URI a través de componentes en lugar de a partir de una sola cadena.

La belleza de este enfoque es que puede tomar cualquier cadena de URL válida y hacer que funcione sin necesidad de ningún conocimiento especial de la misma.

+18

Esta debería ser la respuesta correcta. esta es la forma formal y clara de hacerlo –

+3

También puede ser una buena idea urldecode urlStr antes de enviarlo al constructor de URL. URLDecoder.decode (urlStr) –

+3

Seguramente esta debería ser la respuesta correcta. – AB1209

59

para Android, me gustaría utilizar cadena android.net.Uri.encode (String s)

Codifica caracteres de la cadena dada como '%' - escapado octetos utilizando el esquema de codificación UTF-8. Deja letras ("A-Z", "a-z"), números ("0-9") y caracteres sin reserva ("_- !. ~ '() *") intactos. Codifica todos los otros personajes.

Ex/

String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query); 
+1

Desafortunadamente 'Uri.encode (" a = 1 & b = 1 ")' produce 'a% 3D1% 26b% 3D1' pero se esperaba' a = 1 & b = 1' – loentar

+8

@loentar Ese es el resultado esperado. Si el usuario ingresa 'a = 1 & b = 1' como una consulta, desea consultar exactamente eso. –

42

También se puede utilizar esta

private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%"; 
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS); 

que es el método más sencillo

+1

esta no es la mejor solución, pero definitivamente es una buena solución rápida ... thanx –

+4

Esta es la solución más rápida cuando toda la URL no es confiable. ¡Gracias! – user1032613

+0

¿Estás seguro de que se debe permitir el%? ¿No debería estar codificado? – MediumOne

2
try { 
        query = URLEncoder.encode(query, "utf-8"); 
       } catch (UnsupportedEncodingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
1

puede utilizar debajo de métodos

public static String parseUrl(String surl) throws Exception 
{ 
    URL u = new URL(surl); 
    return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString(); 
} 

o

public String parseURL(String url, Map<String, String> params) 
{ 
    Builder builder = Uri.parse(url).buildUpon(); 
    for (String key : params.keySet()) 
    { 
     builder.appendQueryParameter(key, params.get(key)); 
    } 
    return builder.build().toString(); 
} 

el segundo es mejor que primero.

Cuestiones relacionadas