web-dev-qa-db-fra.com

Codage d'URL dans Android

Comment encodez-vous un URL dans Android?

Je pensais que c'était comme ça:

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

Si je fais ce qui précède, le http:// dans urlAsString est remplacé par http%3A%2F%2F dans encodedURL et j'obtiens un Java.net.MalformedURLException lorsque j'utilise l'URL.

316
hpique

Vous ne codez pas l'intégralité de l'URL, mais seulement des parties qui proviennent de "sources non fiables".

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

Sinon, vous pouvez utiliser Strings.urlEncode (String str) sur DroidParts sans les exceptions vérifiées.

Ou utilisez quelque chose comme

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

Je vais ajouter une suggestion ici. Vous pouvez faire cela, ce qui évite d'avoir à avoir des bibliothèques externes.

Essayez ceci:

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

Vous pouvez voir que dans cette URL particulière, je dois coder ces espaces pour pouvoir l'utiliser pour une requête.

Cela tire parti de quelques fonctionnalités disponibles dans les classes Android. Premièrement, la classe d'URL peut fractionner une URL en ses propres composants, vous évitant ainsi de devoir effectuer un travail de recherche/remplacement de chaîne. Deuxièmement, cette approche tire parti de la fonctionnalité de classe d'URI consistant à échapper correctement les composants lorsque vous construisez un URI via des composants plutôt qu'à partir d'une seule chaîne.

La beauté de cette approche réside dans le fait que vous pouvez utiliser n'importe quelle chaîne d'URL valide et la faire fonctionner sans aucune connaissance particulière de celle-ci.

162
Craig B

Pour Android, j'utiliserais String Android.net.Uri.encode (String s)

Encode les caractères de la chaîne donnée en tant que '%' - octets d'échappement en utilisant le schéma UTF-8. Laisse les lettres ("A-Z", "a-z"), les chiffres ("0-9") et les caractères non réservés ("_- !. ~ '() *") intactes. Encode tous les autres caractères.

Ex/

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

Aussi, vous pouvez utiliser cette

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

c'est la méthode la plus simple

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

vous pouvez utiliser les méthodes ci-dessous

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

ou

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

le second est meilleur que le premier.

1
Elango