Vodič za Java kodiranje / dekodiranje

1. Uvod

Jednostavno rečeno, kodiranje URL-a prevodi posebne znakove iz URL-a u prikaz koji se pridržava specifikacija i može se ispravno razumjeti i protumačiti.

U ovom ćemo se članku usredotočiti na kako kodirati / dekodirati URL ili podatke obrasca tako da se pridržava specifikacija i pravilno prenosi mrežom.

2. Analizirajte URL

Osnovna sintaksa URI-a može se generalizirati kao:

shema: [// [korisnik: [zaštićen e-poštom]] host [: port]] [/] put [? upit] [# fragment]

Prvi korak u kodiranju URI-ja je ispitivanje njegovih dijelova, a zatim kodiranje samo relevantnih dijelova.

Pogledajmo primjer URI-ja:

String testUrl = "//www.baeldung.com?key1=value+1&key2=value%40%21%242&key3=value%253";

Jedan od načina analize URI-a je učitavanje String reprezentacije u java.net.URI razred:

@Test public void givenURL_whenAnalyze_thenCorrect () baca iznimku {URI uri = novi URI (testUrl); assertThat (uri.getScheme (), je ("http")); assertThat (uri.getHost (), is ("www.baeldung.com")); assertThat (uri.getRawQuery (), .is ("key1 = value + 1 & key2 = value% 40% 21% 242 & key3 = value% 253")); }

The URI klasa analizira URL predstavljanja niza i izlaže njegove dijelove putem jednostavnog API-ja - npr. getXXX.

3. Kodirajte URL

Kada se kodira URI, jedna od najčešćih zamki je kodiranje kompletnog URI-a. Tipično moramo kodirati samo dio upita URI-ja.

Kodirajmo podatke pomoću kodiraj (podaci, encodingScheme) metoda URLEncoder razred:

private String encodeValue (vrijednost niza) {return URLEncoder.encode (value, StandardCharsets.UTF_8.toString ()); } @Test javna praznina givenRequestParam_whenUTF8Scheme_thenEncode () baca izuzetak {Map requestParams = new HashMap (); requestParams.put ("key1", "value 1"); requestParams.put ("key2", "[email protected]! $ 2"); requestParams.put ("key3", "value% 3"); String encodedURL = requestParams.keySet (). Stream () .map (key -> key + "=" + encodeValue (requestParams.get (key))) .collect (pridruživanje ("&", "//www.baeldung. com? "," ")); assertThat (testUrl, is (encodedURL)); 

The kodirati metoda prihvaća dva parametra:

  1. podaci - niz koji treba prevesti
  2. encodingScheme - naziv kodiranja znakova

Ovaj kodirati metoda pretvara niz u application / x-www-form-urlencoded format.

Shema kodiranja pretvorit će posebne znakove u dvoznamenkasti heksadecimalni prikaz od 8 bitova koji će biti predstavljeni u obliku "% xy“. Kada imamo posla s parametrima puta ili dodavanjem dinamičkih parametara, tada ćemo kodirati podatke i poslati ih na poslužitelj.

Bilješka: The Konzorcij za World Wide Web Preporuka kaže da UTF-8 trebalo bi se koristiti. Ako to ne učinite, to može dovesti do nekompatibilnosti. (Referenca: //docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html)

4. Dekodirajte URL

Dekodirajmo sada prethodni URL pomoću metode dekodiranja datoteke URLDecoder:

privatno dekodiranje niza (vrijednost niza) {return URLDecoder.decode (vrijednost, StandardCharsets.UTF_8.toString ()); } @Test javna praznina givenRequestParam_whenUTF8Scheme_thenDecodeRequestParams () {URI uri = novi URI (testUrl); Shema niza = uri.getScheme (); Niz hosta = uri.getHost (); String upit = uri.getRawQuery (); Niz decodedQuery = Nizovi.stream (query.split ("&")) .map (param -> param.split ("=") [0] + "=" + decode (param.split ("=") [1 ])) .collect (Collectors.joining ("&")); assertEquals ("//www.baeldung.com?key1=value 1 & [email protected]! $ 2 & key3 = value% 3", diagram + ": //" + host + "?" + decodedQuery); }

Dva važna bita ovdje su:

  • analizirati URL prije dekodiranja
  • koristiti istu shemu kodiranja za kodiranje i dekodiranje

Ako bismo dekodirali nego analizirali, dijelovi URL-a možda neće biti pravilno raščlanjeni. Ako bismo za dekodiranje podataka koristili drugu shemu kodiranja, to bi rezultiralo podacima o smeću.

5. Kodiranje segmenta puta

URLEncoder ne može se koristiti za kodiranje segmenta staze URL. Komponenta puta odnosi se na hijerarhijsku strukturu koja predstavlja put direktorija ili služi za lociranje resursa odvojenih znakom “/”.

Rezervirani znakovi u segmentu puta razlikuju se od vrijednosti parametara upita. Na primjer, znak "+" važeći je znak u segmentu puta i stoga ga ne treba kodirati.

Za kodiranje segmenta puta koristimo UriUtils klasa umjesto Spring Framework-a. UriUtils razred pruža encodePath i encodePathSegment metode za kodiranje putanje odnosno segmenta puta.

Pogledajmo primjer:

privatni niz encodePath (put niza) {try {path = UriUtils.encodePath (put, "UTF-8"); } catch (UnsupportedEncodingException e) {LOGGER.error ("Parametar kodiranja pogreške {}", e.getMessage (), e); } povratni put; }
@Test javna praznina givenPathSegment_thenEncodeDecode () baca UnsupportedEncodingException {String pathSegment = "/ Put 1 / Put + 2"; Niz encodedPathSegment = encodePath (pathSegment); Niz decodedPathSegment = UriUtils.decode (encodedPathSegment, "UTF-8"); assertEquals ("/ Path% 201 / Path + 2", encodedPathSegment); assertEquals ("/ Put 1 / Put + 2", decodedPathSegment); }

U gornjem isječku koda to možemo vidjeti kada smo koristili encodePathSegment metodom, vratio je kodiranu vrijednost i + se ne kodira jer je to vrijednost vrijednosti u komponenti puta.

Dodajmo varijablu puta na naš testni URL:

String testUrl = "/ path + 1? Key1 = value + 1 & key2 = value% 40% 21% 242 & key3 = value% 253";

a da bismo sastavili i utvrdili pravilno kodiran URL, promijenimo test iz odjeljka 2:

Niz puta = "put + 1"; Niz encodedURL = requestParams.keySet (). Stream () .map (k -> k + "=" + encodeValue (requestParams.get (k))) .collect (pridruživanje ("&", "/" + encodePath (put ) + "?", "")); assertThat (testUrl, CoreMatchers.is (kodiran URL)); 

6. Zaključak

U ovom uputstvu vidjeli smo kako kodirati i dekodirati podatke kako bi ih se moglo ispravno prenijeti i protumačiti. Iako se članak usredotočio na kodiranje / dekodiranje vrijednosti parametara upita URI, pristup se odnosi i na parametre HTML obrasca.

Izvorni kod možete pronaći na GitHubu.