Pieņemsim, ka man ir URL
http://example.com/query?q=
un lietotājs ir ievadījis šādu vaicājumu:
nejaušs vārds £500 banka $
Es gribu, lai rezultāts būtu pareizi kodēts URL:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
Kāds ir labākais veids, kā to panākt? Es mēģināju URLEncoder
un izveidot URI/URL objektus, bet neviens no tiem nav īsti pareizs.
URLEncoder
ir pareizais risinājums. Jums tikai jāatceras, ka kodē tikai atsevišķo vaicājuma virknes parametra nosaukumu un/vai vērtību, nevis visu URL, un noteikti ne vaicājuma virknes parametra atdalītāja rakstzīmi &
, ne parametra nosaukuma un vērtības atdalītāja rakstzīmi =
.
String q = "random word £500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");
Ņemiet vērā, ka atstarpes vaicājuma parametros tiek attēlotas ar +
, nevis %20
, kas ir likumīgi derīgs. Parasti %20
ir jāizmanto, lai atveidotu atstarpes pašā URI (daļā pirms URI-pieprasījuma virknes atdalīšanas zīmes ?
), nevis vaicājuma virknē (daļā pēc ?
).
Jāņem vērā arī, ka ir divas encode()
metodes. Viena bez charset argumenta un otra ar. Metode bez charset argumenta ir novecojusi. Nekad to neizmantojiet un vienmēr norādiet charset argumentu. javadoc pat nepārprotami iesaka izmantot UTF-8 kodējumu, kā to nosaka RFC3986 un W3C.
Visas pārējās rakstzīmes ir nedrošas un vispirms tiek pārvērstas vienā vai vairākos baitos, izmantojot kādu kodēšanas shēmu. Tad katru baitu attēlo trīs rakstzīmju virkne "%xy", kur xy ir baita divciparu sešciparu sešciparu atveidojums. Ieteicamā kodēšanas shēma ir UTF-8. Tomēr saderības apsvērumu dēļ, ja kodējums nav norādīts, tiek izmantots platformas noklusējuma kodējums.
Es neizmantotu URLEncoder
. Papildus tam, ka URLEncoder
ir nepareizi nosaukts (URLEncoder
nav nekāda sakara ar URL), tas ir neefektīvs (Builder vietā tas izmanto StringBuffer
un dara vēl dažas lietas, kas ir lēnas), to ir arī pārāk viegli sabojāt.
Tā vietā es gribētu izmantot URIBuilder
vai Spring's org.springframework.web.util.UriUtils.encodeQuery
vai Commons Apache HttpClient
.
Iemesls ir tāds, ka jums ir jāizvairās no vaicājuma parametra nosaukuma (t.i., BalusC's atbilde q
), nevis no parametra vērtības.
Vienīgais iepriekšminētā trūkums (ko es sāpīgi atklāju) ir tas, ka URL's nav īsts URI's apakškopa.
Koda paraugs:
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
Tā kā es esmu tikai saites uz citām atbildēm, es atzīmēju šo kā kopienas wiki. Jūtieties brīvi rediģēt.