Mai mult
Java URL encoding de parametrii șirului de interogare
Spune că am o adresă URL
http://example.com/query?q=
și am o întrebare introduse de utilizator, cum ar fi:
cuvânt aleator £500 de bancă $
Vreau ca rezultatul sa fie corect codificate URL:
http://example.com/query?q=random%20word%20%A3500%20bank%20%24
Ce's cel mai bun mod de a realiza acest lucru? Am încercat URLEncoder și crearea URI/URL obiecte, dar nici unul dintre ei iese destul de bine.
668
10
URLEncoder
ar trebui să fie calea de a merge. Ai nevoie doar pentru a păstra în minte pentru a codifica numai individuale șir de interogare parametru numele și/sau valoare, nu întregul URL-ul, pentru că nu șirul de interogare parametru caracter separator&
, nici nume parametru-valoare separator caracterul=
.Rețineți că spațiile în parametrii de interogare sunt reprezentate de
+
, nu%20
, care este legal valabil. A%20
este, de obicei, pentru a fi utilizate pentru a reprezenta spații URI în sine (partea dinainte URI-șir de interogare separator caracterul?
), nu în șirul de interogare (partea de după?
).De asemenea, rețineți că există două
encode()
metode. Una fără de caractere argument și un alt cu. Cel fără de caractere argument este învechită. Nu utilizați niciodată și întotdeauna specifica setul de caractere argument. De javadoc chiar și în mod explicit recomandă să utilizați codificarea UTF-8, în calitate de împuternicit RFC3986 și W3C.Se vedea, de asemenea:
[5]: https://www.talisman.org/~erlkonig/misc/lunatech%5Ewhat-fiecare-webdev-trebuie să-stii-despre-url-urile de codificare/
Nu aș folosi
URLEncoder
. În afară de a fi incorect numit (URLEncoder
nu are nimic de-a face cu Url-uri), ineficiente (se folosește un StringBuffer` în loc de Constructor și un cuplu de alte lucruri care sunt lent) Sale, de asemenea, mult prea ușor să dai în bară.În schimb mi-ar folosi
URIBuilder
sau Izvor'sorg.springframework.web.util.UriUtils.encodeQuery
sau Apache CommonsHttpClient
. Motivul fiind că trebuie să scape de parametrii de interogare nume (ie BalusC's a răspunde "q") altfel decât valoarea parametrului.Singurul dezavantaj la cele de mai sus (de care am aflat dureros) este că URL's nu sunt un adevărat subset de URI's.
Mostre de cod:
De când am'm doar conectarea la alte răspunsuri am marcat acest lucru ca pe o comunitate wiki. Simțiți-vă liber pentru a edita.
Aveți nevoie să creați mai întâi un URI, cum ar fi:
Apoi converti Uri ASCII string:
Acum url string este complet codificat în primul rând am făcut-o simplă codificare url-ul și apoi ne-am convertit în Șir ASCII pentru a asigurați-vă că nici un personaj din afara US-ASCII sunt rămase în șir. Acest lucru este exact modul în care browserele.
Guava 15 a adaugat acum un set de simplu URL-ul evadați.
Apache Http Componente de bibliotecă oferă un elegant opțiune pentru construirea și codare interogare params -
Cu HttpComponents 4.x utilizați - URLEncodedUtils
Pentru HttpClient 3.x utilizați - EncodingUtil
Aici's o metodă puteți folosi în cod pentru a converti un șir url și harta de parametri de la un valabile codificat url string care conține parametrii de interogare.
Utilizați următoarele Java standard soluție (trece în jurul valorii de 100 de testcases furnizate de Web Plattform Teste):
0. Test dacă URL-ul este deja codificat. Înlocuiți '+' codificate spații cu '%20' codat spații.
1. Split URL-ul în părți structurale. Folosesc java.net.URL-ul pentru asta.
2. Codifica fiecare parte structurală în mod corespunzător!
3. Utilizarea
IDN.toASCII(putDomainNameHere)
a Punycode codifica numele de gazdă!4. Folosesc java.net.URI.toASCIIString()` a la sută-encode, NFC codificate unicode (mai bine ar fi NFKC!). Pentru mai multe informații a se vedea: https://stackoverflow.com/questions/49768599/how-to-encode-properly-this-url/49778055#49778055
Printuri
Aici sunt câteva exemple care va lucra, de asemenea, în mod corespunzător
În cazul meu, am nevoie doar pentru a trece tot url-ul și codifica numai valoarea fiecărui parametru. Am't găsi un cod comun pentru a face asta atât de (!!) așa că am creat acest mic metodă de a face treaba :
Folosește org.apache.commons.lang3.StringUtils
În android mi-ar folosi acest cod:
Unde
Uri
e unandroid.net.Uri
String encodedUrl1 = UriUtils.encodeQuery(interogare, "UTF-8");//nu se modifica String encodedUrl2 = URLEncoder.codifica(interogare, "UTF-8");//s-a schimbat String encodedUrl3 = URLEncoder.codifica(interogare, StandardCharsets.UTF_8.displayName());//s-a schimbat
Sistem.afară.println("url1 " + encodedUrl1 + "\n" + "url2=" + encodedUrl2 + "\n" + "url3=" + encodedUrl3);