Útmutató a Java URL kódolásához / dekódolásához
1. Bemutatkozás
Egyszerűen fogalmazva, az URL-kódolás a speciális karaktereket az URL-ből olyan ábrázolássá alakítja, amely betartja a specifikációt, és helyesen érthető és értelmezhető.
Ebben a cikkben a következőkre fogunk összpontosítani hogyan kell kódolni / dekódolni az URL-t, vagy formázni az adatokat hogy betartsa a specifikációt és helyesen továbbítsa a hálózaton keresztül.
2. Elemezze az URL-t
Az alapvető URI szintaxist a következőképpen lehet általánosítani:
séma: [// [felhasználó: [e-mail védett]] hoszt [: port]] [/] elérési út [? lekérdezés] [# töredék]
Az URI kódolásának első lépése az alkatrészek vizsgálata, majd csak a releváns részek kódolása.
Nézzünk meg egy URI-példát:
Karakterlánc tesztUrl = "//www.baeldung.com?key1=value+1&key2=value%40%21%242&key3=value%253";
Az URI elemzésének egyik módja a String reprezentáció betöltése a java.net.URI osztály:
@Test public void givenURL_whenAnalyze_thenCorrect () kiveti az {URI uri = new URI (testUrl) kivételt; assertThat (uri.getScheme (), is ("http")); assertThat (uri.getHost (), is ("www.baeldung.com")); assertThat (uri.getRawQuery (), .is ("kulcs1 = érték + 1 és kulcs2 = érték% 40% 21% 242 & kulcs3 = érték% 253"); }
A URI osztály elemzi a karakterlánc reprezentációs URL-t, és annak részeit egy egyszerű API-n keresztül teszi ki - pl. getXXX.
3. Kódolja az URL-t
Az URI kódolásakor az egyik gyakori buktató a teljes URI kódolása. Általában csak az URI lekérdezési részét kell kódolnunk.
Kódoljuk az adatokat a kódolás (adatok, encodingScheme) módszere URLEncoder osztály:
private String encodeValue (String value) {return URLEncoder.encode (érték, StandardCharsets.UTF_8.toString ()); } @Test public void givenRequestParam_whenUTF8Scheme_thenEncode () dobja a Kivételt {Map requestParams = new HashMap (); requestParams.put ("kulcs1", "1-es érték"); requestParams.put ("key2", "[email protected]! $ 2"); requestParams.put ("key3", "% 3 érték"); String encodedURL = requestParams.keySet (). Stream () .map (kulcs -> kulcs + "=" + encodeValue (requestParams.get (kulcs))) .collect (csatlakozás ("&", "//www.baeldung. com? "," ")); assertThat (testUrl, van (kódoltURL));
A kódol metódus két paramétert fogad el:
- adat - lefordítandó karakterlánc
- encodingScheme - a karakterkódolás neve
Ez kódol metódus konvertálja a karakterláncot application / x-www-form-urlencoded formátum.
A kódolási séma a speciális karaktereket két számjegyű 8 bites hexadecimális ábrázolássá konvertálja, amelyek a következő formában jelennek meg:% xy“. Amikor elérési útparaméterekkel foglalkozunk, vagy dinamikus paramétereket adunk hozzá, akkor kódoljuk az adatokat, majd elküldjük a szervernek.
Jegyzet: A World Wide Web Consortium Az ajánlás kimondja, hogy UTF-8 kell használni. Ennek elmulasztása összeférhetetlenséget okozhat. (Referencia: //docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html)
4. Dekódolja az URL-t
Dekódoljuk most az előző URL-t a URLDecoder:
privát karakterlánc-dekódolás (karakterlánc-érték) {return URLDecoder.decode (érték, StandardCharsets.UTF_8.toString ()); } @Test public void givenRequestParam_whenUTF8Scheme_thenDecodeRequestParams () {URI uri = új URI (testUrl); Karakterlánc = uri.getScheme (); Karaktersorozat = uri.getHost (); Karakterlánc lekérdezés = uri.getRawQuery (); Karakterlánc decodedQuery = Arrays.stream (query.split ("&")) .map (param -> param.split ("=") [0] + "=" + dekódolás (param.split ("=") [1 ])) .gyűjtsd össze (Gyűjtők.csatlakozás ("&")); assertEquals ("//www.baeldung.com?key1=value 1 & [email protected]! $ 2 & key3 = value% 3", séma + ": //" + host + "?" + decodedQuery); }
A két fontos bit itt:
- elemezze az URL-t dekódolás előtt
- ugyanazt a kódolási sémát használja a kódoláshoz és a dekódoláshoz
Ha dekódolnánk, mint elemeznénk, akkor előfordulhat, hogy az URL-részeket nem megfelelően elemzik. Ha egy másik kódolási sémát használtunk az adatok dekódolásához, az szemétadatokat eredményezett.
5. Kódoljon egy útszakaszt
URLEncoder nem használható a URL. Az útvonalkomponens a hierarchikus struktúrára utal, amely egy könyvtár útvonalát képviseli, vagy az erőforrások elkülönítésével található “/”.
A lefoglalt karakterek az útszakaszban különböznek a lekérdezési paraméterek értékeitől. Például a „+” jel érvényes karakter az útszakaszban, ezért nem szabad kódolni.
Az útszakasz kódolásához a UriUtils osztály helyett a Spring Framework. UriUtils osztály biztosítja encodePath és encodePathSegment az útvonal és az útszakasz kódolásának módszerei.
Nézzünk meg egy példát:
privát karakterlánc encodePath (karakterlánc útvonala) {try {path = UriUtils.encodePath (elérési út, "UTF-8"); } catch (UnsupportedEncodingException e) {LOGGER.error ("Hiba kódolási paraméter {}", e.getMessage (), e); } visszatérési útvonal; }
@Test public void givenPathSegment_thenEncodeDecode () dobja az UnsupportedEncodingException {String pathSegment = "/ 1. útvonal / útvonal + 2" parancsot; String encodedPathSegment = encodePath (pathSegment); String decodedPathSegment = UriUtils.decode (encodedPathSegment, "UTF-8"); assertEquals ("/ Path% 201 / Path + 2", encodedPathSegment); assertEquals ("/ 1. útvonal / útvonal + 2", dekódoltPathSegment); }
A fenti kódrészletben láthatjuk, hogy amikor a encodePathSegment metódussal adta vissza a kódolt értéket, és a + nincs kódolva, mert ez egy érték karakter az útvonal komponensben.
Adjunk hozzá egy elérési útváltozót a teszt URL-hez:
Karakterlánc tesztUrl = "/ útvonal + 1? Kulcs1 = érték + 1 & kulcs2 = érték% 40% 21% 242 & kulcs3 = érték% 253";
és egy megfelelően kódolt URL összeállításához és megadásához változtassuk meg a tesztet a 2. szakaszban:
Karakterlánc útvonala = "útvonal + 1"; String encodedURL = requestParams.keySet (). Stream () .map (k -> k + "=" + encodeValue (requestParams.get (k))) .collect (joining ("&", "/" + encodePath (elérési út ) + "?", "")); assertThat (testUrl, CoreMatchers.is (encodedURL));
6. Következtetés
Ebben az oktatóanyagban láthattuk, hogyan kell az adatokat kódolni és dekódolni, hogy azokat megfelelően továbbítsák és értelmezhessék. Míg a cikk az URI lekérdezési paraméterek értékeinek kódolására / dekódolására összpontosított, a megközelítés a HTML űrlap paraméterekre is vonatkozik.
A forráskódot a GitHubon találja meg.