Dis que j'ai une URL
http://example.com/query?q=
et j'ai une requête saisie par l'utilisateur telle que:
mot aléatoire £ 500 banque $
Je veux que le résultat soit une URL correctement encodé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é de URLEncoder
créer des objets URI / URL mais aucun d'entre eux ne semble tout à fait correct.
Réponses:
URLEncoder
est la voie à suivre. Il vous suffit de garder à l'esprit pour encoder uniquement le nom et / ou la valeur du paramètre de chaîne de requête individuelle, pas l'URL entière, bien sûr pas le caractère séparateur de paramètre de chaîne de requête&
ni le caractère séparateur nom-valeur de paramètre=
.Notez que les espaces dans les paramètres de requête sont représentés par
+
, non%20
, ce qui est valablement valide. Le%20
est généralement utilisé pour représenter les espaces dans l'URI lui-même (la partie avant le caractère séparateur de chaîne de requête URI?
), pas dans la chaîne de requête (la partie après?
).Notez également qu'il existe trois
encode()
méthodes. Un sansCharset
comme deuxième argument et un autre avecString
comme deuxième argument qui lève une exception vérifiée. Celui sansCharset
argument est obsolète. Ne l'utilisez jamais et spécifiez toujours l'Charset
argument. Le javadoc recommande même explicitement d'utiliser le codage UTF-8, tel que prescrit par RFC3986 et W3C .Voir également:
la source
URLEncoder
concerne lesapplication/x-www-form-urlencoded
règles de conformité des paramètres de requête encodés par URL . Les paramètres de chemin ne rentrent pas dans cette catégorie. Vous avez plutôt besoin d'un encodeur URI.Je n'utiliserais pas
URLEncoder
. En plus d'être mal nommé (URLEncoder
n'a rien à voir avec les URL), inefficace (il utilise unStringBuffer
au lieu de Builder et fait quelques autres choses qui sont lentes). C'est aussi beaucoup trop facile à visser.Au lieu de cela , j'utiliser
URIBuilder
ou de printempsorg.springframework.web.util.UriUtils.encodeQuery
ou Apache CommonsHttpClient
. La raison étant que vous devez échapper le nom des paramètres de la requête (c'est-à-dire la réponse de BalusCq
) différemment de la valeur du paramètre.Le seul inconvénient de ce qui précède (que j'ai découvert douloureusement) est que les URL ne sont pas un véritable sous-ensemble d'URI .
Exemple de code:
Comme je ne fais que créer un lien vers d'autres réponses, j'ai marqué cela comme un wiki communautaire. N'hésitez pas à modifier.
la source
URLEncoder
comme le dit son javadoc, il est destiné à coder les paramètres de la chaîne de requête conformémentapplication/x-www-form-urlencoded
à la description HTML: w3.org/TR/html4/interact/… . Certains utilisateurs le confondent / abusent pour encoder des URI entiers, comme le répondeur actuel l'a apparemment fait.Vous devez d'abord créer un URI comme:
Ensuite, convertissez cette Uri en chaîne ASCII:
Maintenant, votre chaîne d'URL est complètement codée.Nous avons d'abord effectué un simple codage d'URL, puis nous l'avons convertie en chaîne ASCII pour nous assurer qu'aucun caractère en dehors de US-ASCII ne reste dans la chaîne. C'est exactement ce que font les navigateurs.
la source
URL.toURI()
.+
remplacement des espaces, mais a accepté le% 20, donc cette solution fonctionnait mieux que BalusC, merci!Guava 15 a maintenant ajouté un ensemble d'échappeurs d'URL simples .
la source
URLEncoder
.URLEncoder
ne le fait pas.La bibliothèque de composants Apache Http fournit une option intéressante pour la création et le codage des paramètres de requête -
Avec HttpComponents 4.x, utilisez - URLEncodedUtils
Pour HttpClient 3.x - EncodingUtil
la source
Voici une méthode que vous pouvez utiliser dans votre code pour convertir une chaîne d'URL et une carte de paramètres en une chaîne d'URL codée valide contenant les paramètres de requête.
la source
Impressions
Que se passe-t-il ici?
1. Fractionnez l'URL en parties structurelles. Utilisez
java.net.URL
pour cela.2. Codez correctement chaque pièce structurelle!
3. Utilisez
IDN.toASCII(putDomainNameHere)
pour Punycode encoder le nom d'hôte!4. Utilisez
java.net.URI.toASCIIString()
pour coder en pourcentage, unicode codé NFC - (mieux serait NFKC!). Pour plus d'informations, voir: Comment coder correctement cette URLDans certains cas, il est conseillé de vérifier si l'URL est déjà encodée . Remplacez également les espaces encodés '+' par des espaces encodés '% 20'.
Voici quelques exemples qui fonctionneront également correctement
La solution passe environ 100 des cas de test fournis par Web Plattform Tests .
la source
Dans Android, j'utiliserais ce code:
Où
Uri
est unandroid.net.Uri
la source
Dans mon cas, j'avais juste besoin de passer toute l'URL et de coder uniquement la valeur de chaque paramètre. Je n'ai pas trouvé de code commun pour le faire, alors (!!) j'ai donc créé cette petite méthode pour faire le travail:
Il utilise org.apache.commons.lang3.StringUtils
la source
Vous pouvez utiliser le code suivant.
la source
=
et&
, ce qui n'est pas correct.