Encodage d’URL dans Android

Comment encodez-vous une URL dans Android?

Je pensais que c’était comme ça:

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

Si je fais ce qui précède, le http:// dans urlAsSsortingng est remplacé par http%3A%2F%2F dans encodedURL puis j’obtiens une java.net.MalformedURLException lorsque j’utilise l’URL.

Vous n’encodez pas la totalité de l’URL, mais seulement certaines parties provenant de “sources non fiables”.

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

Alternativement, vous pouvez utiliser Ssortingngs.urlEncode (Ssortingng str) de DroidParts qui ne lance pas les exceptions vérifiées.

Ou utiliser quelque chose comme

 Ssortingng uri = Uri.parse("http://...") .buildUpon() .appendQueryParameter("key", "val") .build().toSsortingng(); 

Je vais append une suggestion ici. Vous pouvez le faire ce qui évite d’avoir à obtenir des bibliothèques externes.

Essayez ceci:

 Ssortingng 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(); 

Vous pouvez voir que dans cette URL particulière, je dois avoir ces espaces encodés pour que je puisse les utiliser pour une requête.

Cela profite de quelques fonctionnalités disponibles dans les classes Android. Tout d’abord, la classe d’URL peut diviser une URL en ses propres composants, vous n’avez donc pas à effectuer de travail de recherche / remplacement de chaîne. Deuxièmement, cette approche tire parti de la fonctionnalité de classe d’URI consistant à échapper correctement aux composants lorsque vous construisez un URI via des composants plutôt qu’à partir d’une seule chaîne.

La beauté de cette approche est que vous pouvez prendre n’importe quelle chaîne d’URL valide et la faire fonctionner sans avoir besoin de connaissances particulières.

Pour Android, j’utiliserais Ssortingng android.net.Uri.encode (Ssortingng s)

Encode les caractères de la chaîne donnée en tant qu ‘«%» – octets échappés à l’aide du schéma UTF-8. Laisse des lettres (“AZ”, “az”), des chiffres (“0-9”) et des caractères non réservés (“_- !. ~ ‘() *”) intacts. Encode tous les autres personnages.

Ex/

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

Aussi, vous pouvez utiliser cette

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

c’est la méthode la plus simple

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

vous pouvez utiliser les méthodes ci-dessous

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

ou

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

le second est meilleur que le premier.

Assurez-vous d’utiliser essayer … attraper. Sinon, ça échoue.