Ú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:

  1. adat - lefordítandó karakterlánc
  2. 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.