Codage Java URL des paramètres de la chaîne d'interrogation

Disons que j'ai une URL

http://example.com/query?q=

et j'ai une requête entrée par l'utilisateur telle que :

mot aléatoire £500 bank $

Je veux que le résultat soit une URL correctement codée :

http://example.com/query?q=random%20word%20%A3500%20bank%20%24

Quelle est la meilleure façon d'y parvenir ? J'ai essayé URLEncoder et de créer des objets URI/URL, mais rien n'est satisfaisant.

Solution

[URLEncoder][1] devrait être la solution. Vous devez seulement garder à l'esprit d'encoder seulement le nom et/ou la valeur du paramètre de la chaîne de requête individuelle, pas l'URL entière, et certainement pas le caractère séparateur du paramètre de la chaîne de requête & ni le caractère séparateur nom-valeur du paramètre =.

String q = "random word £500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");

Notez que les espaces dans les paramètres de requête sont représentés par +, et non par %20, qui est légitimement valide. Le %20 doit généralement être utilisé pour représenter les espaces dans l'URI lui-même (la partie avant le caractère séparateur URI-chaîne de requête ?), et non dans la chaîne de requête (la partie après ?).

Notez également qu'il existe deux méthodes encode(). Une sans argument charset et une autre avec. Celle sans argument charset est dépréciée. Ne l'utilisez jamais et spécifiez toujours l'argument charset. La [javadoc][2] recommande même explicitement d'utiliser l'encodage UTF-8, comme l'exigent la [RFC3986][3] et le [W3C][4].

Tous les autres caractères ne sont pas sûrs et sont d'abord convertis en un ou plusieurs octets à l'aide d'un schéma de codage. Chaque octet est ensuite représenté par la chaîne de trois caractères "%xy&quot ;, où xy est la représentation hexadécimale à deux chiffres de l'octet. Le schéma d'encodage recommandé est UTF-8. Toutefois, pour des raisons de compatibilité, si un codage n'est pas spécifié, le codage par défaut de la plate-forme est utilisé.

Voir aussi :

Commentaires (11)

Je n'utiliserais pas URLEncoder. En plus d'être mal nommé (URLEncoder n'a rien à voir avec les URLs), inefficace (il utilise un StringBuffer au lieu de Builder et fait quelques autres choses qui sont lentes), il est aussi beaucoup trop facile de le bousiller.

J'utiliserais plutôt URIBuilder ou [Spring's org.springframework.web.util.UriUtils.encodeQuery ou Commons Apache HttpClient][1]. La raison en est que vous devez échapper le nom du paramètre de requête (c'est-à-dire la réponse de BalusC q) différemment de la valeur du paramètre.

Le seul inconvénient de ce qui précède (que j'ai découvert péniblement) est que [les URL ne sont pas un véritable sous-ensemble des URI][2].

Exemple de code :

import org.apache.http.client.utils.URIBuilder;

URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank \$");
String url = ub.toString();

// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24

*Comme je ne fais que renvoyer à d'autres réponses, j'ai marqué cette page comme étant un wiki communautaire. N'hésitez pas à l'éditer.

[1] : https://stackoverflow.com/questions/444112/how-do-i-encode-uri-parameter-values [2] : http://adamgent.com/post/25161273526/urls-are-not-a-subset-of-uris

Commentaires (9)