Codifica URL Java dei parametri della stringa di query

Dì che ho un URL

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

e ho una query inserita dall’utente come:

parola casuale £ 500 bank $

Voglio che il risultato sia un URL correttamente codificato:

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

Qual è il modo migliore per raggiungere questo objective? Ho provato URLEncoder e la creazione di oggetti URI / URL ma nessuno di loro è uscito abbastanza bene.

URLEncoder dovrebbe essere la strada da percorrere. Devi solo ricordare di codificare solo il singolo nome e / o valore del parametro della stringa di query, non l’intero URL, di sicuro non il carattere del separatore del parametro stringa della query né il parametro nome-valore carattere separatore = .

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

Si noti che gli spazi nei parametri di query sono rappresentati da + , non da %20 , che è legittimamente valido. Di solito, il %20 deve essere utilizzato per rappresentare gli spazi nell’URI stesso (la parte prima del carattere URI-query stringa separatore ? ), Non nella stringa di query (la parte dopo ? ).

Si noti inoltre che esistono due metodi encode() . Uno senza argomento charset e un altro con. Quello senza argomento charset è deprecato. Non usarlo mai e specificare sempre l’argomento charset. Javadoc consiglia anche esplicitamente di utilizzare la codifica UTF-8, come richiesto da RFC3986 e W3C .

Tutti gli altri caratteri non sono sicuri e vengono prima convertiti in uno o più byte utilizzando uno schema di codifica. Quindi ogni byte è rappresentato dalla stringa di 3 caratteri “% xy”, dove xy è la rappresentazione esadecimale a due cifre del byte. Lo schema di codifica raccomandato da utilizzare è UTF-8 . Tuttavia, per ragioni di compatibilità, se non viene specificata una codifica, viene utilizzata la codifica predefinita della piattaforma.

Guarda anche:

  • Ciò che ogni sviluppatore web deve sapere sulla codifica dell’URL

Non URLEncoder . Oltre ad essere chiamato in modo errato ( URLEncoder non ha nulla a che fare con gli URL), è inefficiente (usa un StringBuffer posto di Builder e fa un paio di altre cose che sono lenti) È anche troppo facile rovinarlo.

Invece URIBuilder o Spring’s org.springframework.web.util.UriUtils.encodeQuery o Commons Apache HttpClient . Il motivo è che devi sfuggire al nome dei parametri della query (es. La risposta di BalusC q ) in modo diverso rispetto al valore del parametro.

L’unico lato negativo di cui sopra (che ho scoperto dolorosamente) è che gli URL non sono un vero sottoinsieme di URI .

Codice d’esempio:

 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 

Dal momento che sto solo collegando ad altre risposte, ho contrassegnato questo come wiki della comunità. Sentiti libero di modificare.

Devi prima creare un URI come:

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

Quindi converti Uri in stringa ASCII:

  urlStr=uri.toASCIIString(); 

Ora la tua stringa url è completamente codificata prima abbiamo fatto la semplice codifica url e poi la abbiamo convertita in stringa ASCII per assicurarci che nessun carattere al di fuori degli US-ASCII rimanga nella stringa. Questo è esattamente come fanno i browser.

Guava 15 ora ha aggiunto una serie di semplici escape di URL .

La libreria Apache Http Components fornisce un’opzione ordinata per la creazione e la codifica dei parametri di query –

Con HttpComponents 4.x usa – URLEncodedUtils

Per HttpClient 3.x usare – EncodingUtil

Ecco un metodo che puoi utilizzare nel tuo codice per convertire una stringa di url e una mappa di parametri in una stringa di url codificata valida contenente i parametri di query.

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

Vorrei usare questo codice:

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

1. Dividere l’URL in parti strutturali. Usa java.net.URL per questo.

2. Codifica ogni parte strutturale correttamente!

3. Utilizzare IDN.toASCII(putDomainNameHere) in Punycode per codificare il nome host!

4. Usa java.net.URI.toASCIIString() in codifica in percentuale, unicode codificato NFC – (meglio sarebbe NFKC!). Per maggiori informazioni vedi: Come codificare correttamente questo 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()); String correctEncodedURL=uri.toASCIIString(); System.out.println(correctEncodedURL); 

stampe

 http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$ 
  1. Usa questo: URLEncoder.encode (query, StandardCharsets.UTF_8.displayName ()); oppure questo: URLEncoder.encode (query, “UTF-8”);
  2. È ansible utilizzare il codice follwing.

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