Codage de l’URL Java des parameters de la chaîne de requête

Disons 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é URLEncoder et créé des objects URI / URL, mais aucun d’entre eux ne s’est avéré correct.

    URLEncoder devrait être la voie à suivre. Il vous suffit de garder à l’esprit de ne coder que le nom et / ou la valeur du paramètre de la chaîne de requête individuelle, pas l’URL complète, à

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

    Notez que les espaces dans les parameters de requête sont représentés par + , pas %20 , ce qui est légitimement valide. Le %20 doit généralement être utilisé pour représenter des 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 deux méthodes encode() . Un sans argument charset et un autre avec. Celui sans argument charset est obsolète. Ne l’utilisez jamais et spécifiez toujours l’argument charset. Le javadoc recommande même explicitement d’utiliser le codage UTF-8, comme requirejs par RFC3986 et W3C .

    Tous les autres caractères sont dangereux et sont d’abord convertis en un ou plusieurs octets en utilisant un schéma de codage. Ensuite, chaque octet est représenté par la chaîne de 3 caractères “% xy”, où xy est la représentation hexadécimale à deux chiffres de l’octet. Le schéma d’encodage recommandé à utiliser est UTF-8 . Cependant, 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 également:

    • Ce que tout développeur Web doit savoir sur le codage d’URL

    Je n’utiliserais pas URLEncoder . En plus d’être mal nommé ( URLEncoder n’a rien à voir avec les URL), inefficace (il utilise un SsortingngBuffer au lieu de Builder et fait deux autres choses qui sont lentes).

    Au lieu de cela, je voudrais utiliser org.springframework.web.util.UriUtils.encodeQuery ou Commons Apache HttpClient de org.springframework.web.util.UriUtils.encodeQuery ou HttpClient . La raison en est que vous devez échapper au nom des parameters de la requête (c.-à-d. 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 douloureusement) est que les URL ne sont pas un véritable sous-ensemble d’URI .

    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 \$"); Ssortingng url = ub.toSsortingng(); // Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24 

    Étant donné que je fais juste un lien vers d’autres réponses, j’ai marqué ceci comme un wiki de communauté. N’hésitez pas à éditer.

    Vous devez d’abord créer un URI comme:

      Ssortingng urlStr = "http://www.example.com/CEREC® Materials & Accessories/IPS Empress® CAD.pdf" URL url= new URL(urlStr); URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); 

    Ensuite, convertissez cette chaîne Uri en chaîne ASCII:

      urlStr=uri.toASCIISsortingng(); 

    Maintenant, votre chaîne d’URL est complètement encodée en premier, nous avons fait un encodage simple d’url, puis nous l’avons converti en chaîne ASCII pour nous assurer qu’aucun caractère en dehors de US-ASCII ne rest dans la chaîne. C’est exactement ce que font les navigateurs.

    Guava 15 a maintenant ajouté un ensemble d’échappés d’URL simples .

    La bibliothèque Apache Http Components fournit une option intéressante pour créer et encoder des parameters de requête –

    Utilisation de HttpComponents 4.x – URLEncodedUtils

    Pour utiliser HttpClient 3.x – EncodingUtil

    Voici une méthode que vous pouvez utiliser dans votre code pour convertir une chaîne d’URL et une carte de parameters en une chaîne d’URL codée valide contenant les parameters de la requête.

     Ssortingng addQuerySsortingngToUrlSsortingng(Ssortingng url, final Map parameters) throws UnsupportedEncodingException { if (parameters == null) { return url; } for (Map.Entry parameter : parameters.entrySet()) { final Ssortingng encodedKey = URLEncoder.encode(parameter.getKey().toSsortingng(), "UTF-8"); final Ssortingng encodedValue = URLEncoder.encode(parameter.getValue().toSsortingng(), "UTF-8"); if (!url.contains("?")) { url += "?" + encodedKey + "=" + encodedValue; } else { url += "&" + encodedKey + "=" + encodedValue; } } return url; } 

    J’utiliserais ce code:

     Uri myUI = Uri.parse ("http://example.com/query").buildUpon().appendQueryParameter("q","random word A3500 bank 24").build(); 

    1. Diviser l’URL en parties structurelles. Utilisez java.net.URL pour cela.

    2. Encodez correctement chaque pièce structurelle!

    3. Utilisez IDN.toASCII(putDomainNameHere) pour Punycode encodez le nom d’hôte!

    4. Utilisez java.net.URI.toASCIISsortingng() pour encoder en pourcentage, unicode NFC encodé – (mieux vaut NFKC!). Pour plus d’informations, voir: Comment encoder correctement cette URL

     URL url= new URL("http://example.com/query?q=random word £500 bank $"); URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); Ssortingng correctEncodedURL=uri.toASCIISsortingng(); System.out.println(correctEncodedURL); 

    Des tirages

     http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$ 
    1. Utilisez ceci: URLEncoder.encode (requête, StandardCharsets.UTF_8.displayName ()); ou ceci: URLEncoder.encode (requête, “UTF-8”);
    2. Vous pouvez utiliser le code suivant.

       Ssortingng encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8");//not change Ssortingng encodedUrl2 = URLEncoder.encode(query, "UTF-8");//changed Ssortingng encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());//changed System.out.println("url1 " + encodedUrl1 + "\n" + "url2=" + encodedUrl2 + "\n" + "url3=" + encodedUrl3);