Java URL-koding av spørringsstrengparametere

La oss si at jeg har en nettadresse

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

og jeg har et spørsmål som brukeren har skrevet inn, for eksempel:

tilfeldig ord £500 bank$

Jeg vil at resultatet skal være en riktig kodet nettadresse:

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

Hva er den beste måten å oppnå dette på? Jeg har prøvd URLEncoder og å lage URI/URL-objekter, men ingen av dem blir helt riktige.

Løsning

URLEncoder bør være veien å gå. Du trenger bare å huske på å kode kun den enkelte spørringsstrengens parameternavn og/eller -verdi, ikke hele URL-en, og absolutt ikke skilletegnet & eller skilletegnet = for parameternavn og -verdi.

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

Merk at mellomrom i spørringsparametere representeres med +, ikke %20, som er gyldig. %20 skal vanligvis brukes til å representere mellomrom i selve URI-en (delen før skilletegnet ?), ikke i spørringsstrengen (delen etter ?).

Legg også merke til at det finnes to encode()-metoder. En uten charset-argument og en annen med. Den uten tegnsett-argumentet er utdatert. Bruk den aldri og spesifiser alltid tegnsett-argumentet. I javadoc anbefales det til og med eksplisitt å bruke UTF-8-koding, som anbefalt av RFC3986 og W3C.

Alle andre tegn er usikre og konverteres først til én eller flere byte ved hjelp av et kodingsskjema. Deretter representeres hver byte av strengen "%xy" med tre tegn, der xy er den tosifrede heksadesimale representasjonen av byten. Det anbefalte kodingsskjemaet er UTF-8. Hvis en koding ikke er spesifisert, brukes imidlertid plattformens standardkoding av kompatibilitetshensyn.

Se også:

Kommentarer (11)

Jeg ville ikke bruke URLEncoder. I tillegg til å være feil navngitt (URLEncoder har ingenting å gjøre med nettadresser), ineffektiv (den bruker en StringBuffer i stedet for Builder og gjør et par andre ting som er trege) Det er også altfor lett å skru den opp.

I stedet ville jeg bruke URIBuilder eller Spring org.springframework.web.util.UriUtils.encodeQuery eller Commons Apache HttpClient. Årsaken er at du må unnslippe navnet på spørringsparametrene (dvs. BalusCs svar q) annerledes enn parameterverdien.

Den eneste ulempen med det ovennevnte (som jeg smertelig fant ut) er at URL-er ikke er en ekte delmengde av URI-er.

Eksempel på kode:

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

*Siden jeg bare lenker til andre svar, har jeg merket dette som en fellesskapswiki. Du er velkommen til å redigere.

Kommentarer (9)