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.
668
3
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.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å:
Jeg ville ikke bruke
URLEncoder
. I tillegg til å være feil navngitt (URLEncoder
har ingenting å gjøre med nettadresser), ineffektiv (den bruker enStringBuffer
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 Springorg.springframework.web.util.UriUtils.encodeQuery
eller Commons ApacheHttpClient
. Årsaken er at du må unnslippe navnet på spørringsparametrene (dvs. BalusCs svarq
) 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:
*Siden jeg bare lenker til andre svar, har jeg merket dette som en fellesskapswiki. Du er velkommen til å redigere.
Guava 15 har nå lagt til et sett med enkle URL escapers.