Sprievodca kódovaním / dekódovaním Java URL

1. Úvod

Jednoducho povedané, kódovanie adresy URL prevádza špeciálne znaky z adresy URL na reprezentáciu, ktorá dodržiava špecifikáciu a dá sa správne pochopiť a interpretovať.

V tomto článku sa zameriame na ako kódovať / dekódovať URL alebo údaje formulára aby dodržiaval špecifikáciu a správne vysielal cez sieť.

2. Analyzujte adresu URL

Základnú syntax URI možno zovšeobecniť ako:

schéma: [// [používateľ: [chránený e-mailom]] hostiteľ [: port]] [/] cesta [? dopyt] [# fragment]

Prvým krokom pri kódovaní URI je preskúmanie jeho častí a následné kódovanie iba príslušných častí.

Pozrime sa na príklad URI:

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

Jedným zo spôsobov analýzy URI je načítanie reprezentácie reťazca do a java.net.URI trieda:

@ Test public void givenURL_whenAnalyze_thenCorrect () vyvolá výnimku {URI uri = nový URI (testUrl); assertThat (uri.getScheme (), je ("http")); assertThat (uri.getHost (), je ("www.baeldung.com")); assertThat (uri.getRawQuery (), .is ("key1 = hodnota + 1 & key2 = hodnota% 40% 21% 242 & key3 = hodnota% 253")); }

The URI trieda analyzuje adresu URL zastúpenia reťazcov a vystavuje jej časti pomocou jednoduchého rozhrania API - napr. getXXX.

3. Kódujte adresu URL

Pri kódovaní URI je jednou z bežných úskalí kódovanie celého URI. Spravidla musíme kódovať iba dopytovanú časť URI.

Poďme kódovať dáta pomocou kódovať (data, encodingScheme) metóda URLEncoder trieda:

private String encodeValue (hodnota reťazca) {návrat URLEncoder.encode (hodnota, StandardCharsets.UTF_8.toString ()); } @Test public void givenRequestParam_whenUTF8Scheme_thenEncode () vyvolá výnimku {Map requestParams = new HashMap (); requestParams.put ("kľúč1", "hodnota 1"); requestParams.put ("key2", "[chránený e-mailom]! $ 2"); requestParams.put ("key3", "hodnota% 3"); Reťazec encodedURL = requestParams.keySet (). Stream () .map (kľúč -> kľúč + "=" + encodeValue (requestParams.get (kľúč))) .collect (spojenie ("&", "//www.baeldung. com? "," ")); assertThat (testUrl, je (encodedURL)); 

The zakódovať metóda akceptuje dva parametre:

  1. údaje - reťazec, ktorý sa má preložiť
  2. encodingScheme - názov kódovania znakov

Toto zakódovať metóda prevádza reťazec na application / x-www-form-urlencoded formát.

Schéma kódovania prevedie špeciálne znaky na dvojciferné hexadecimálne znázornenie 8 bitov, ktoré budú reprezentované vo forme „% xy„. Pokiaľ máme do činenia s parametrami cesty alebo s pridaním parametrov, ktoré sú dynamické, dáta zakódujeme a potom pošleme na server.

Poznámka: The World Wide Web Consortium V odporúčaní sa uvádza, že UTF-8 by sa mali používať. Ak tak neurobíte, môže to spôsobiť nekompatibilitu. (Odkaz: //docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html)

4. Dekódujte adresu URL

Poďme teraz dekódovať predchádzajúcu adresu URL pomocou metódy dekódovania súboru URLDecoder:

private String decode (hodnota reťazca) {návrat URLDecoder.decode (hodnota, StandardCharsets.UTF_8.toString ()); } @Test public void givenRequestParam_whenUTF8Scheme_thenDecodeRequestParams () {URI uri = nový URI (testUrl); Schéma reťazca = uri.getScheme (); Reťazec hostiteľ = uri.getHost (); Reťazec query = uri.getRawQuery (); Reťazec decodedQuery = Arrays.stream (query.split ("&")) .map (param -> param.split ("=") [0] + "=" + dekódovať (param.split ("=") [1 ])) .collect (Collectors.joining ("&")); assertEquals ("//www.baeldung.com?key1=value 1 & [e-mail chránený]! $ 2 & key3 = hodnota% 3", schéma + ": //" + hostiteľ + "?" + decodedQuery); }

Dva dôležité bity sú tu:

  • pred dekódovaním analyzujte adresu URL
  • používajú rovnakú kódovaciu schému na kódovanie a dekódovanie

Ak by sme mali dekódovať a nie analyzovať, časti adresy URL by sa nemuseli správne analyzovať. Keby sme na dekódovanie údajov použili inú schému kódovania, viedlo by to k vyhodeniu údajov.

5. Zakódujte segment cesty

URLEncoder nie je možné použiť na kódovanie segmentu cesty súboru URL. Komponent Cesta označuje hierarchickú štruktúru, ktorá predstavuje cestu k adresáru, alebo slúži na vyhľadanie zdrojov oddelených znakom “/”.

Vyhradené znaky v segmente cesty sú iné ako v hodnotách parametrov dotazu. Napríklad znamienko „+“ je platný znak v segmente cesty, a preto by nemal byť kódovaný.

Na zakódovanie segmentu cesty použijeme UriUtils triedy namiesto toho Spring Framework. UriUtils trieda poskytuje encodePath a encodePathSegment metódy kódovania cesty a segmentu cesty.

Pozrime sa na príklad:

private String encodePath (reťazcová cesta) {try {path = UriUtils.encodePath (cesta, "UTF-8"); } catch (UnsupportedEncodingException e) {LOGGER.error ("Chyba pri kódovaní parametra {}", e.getMessage (), e); } spiatočná cesta; }
@ Test public void givenPathSegment_thenEncodeDecode () vyvolá UnsupportedEncodingException {String pathSegment = "/ Cesta 1 / Cesta + 2"; Reťazec encodedPathSegment = encodePath (pathSegment); Reťazec decodedPathSegment = UriUtils.decode (encodedPathSegment, "UTF-8"); assertEquals ("/ Cesta% 201 / Cesta + 2", encodedPathSegment); assertEquals ("/ Cesta 1 / Cesta + 2", decodedPathSegment); }

Vo vyššie uvedenom útržku kódu je vidieť, že keď sme použili encodePathSegment metóda vrátila zakódovanú hodnotu a + sa nekóduje, pretože ide o hodnotový znak v komponente cesty.

Pridajme k našej testovacej adrese URL premennú cesty:

Reťazec testUrl = "/ cesta + 1? Kľúč1 = hodnota + 1 & kľúč2 = hodnota% 40% 21% 242 & kľúč3 = hodnota% 253";

a ak chceme zostaviť a presadiť správne zakódovanú adresu URL, zmeňme test z časti 2:

Reťazec cesta = "cesta + 1"; Reťazec encodedURL = requestParams.keySet (). Stream () .map (k -> k + "=" + encodeValue (requestParams.get (k))) .collect (joining ("&", "/" + encodePath (cesta) ) + "?", "")); assertThat (testUrl, CoreMatchers.is (encodedURL)); 

6. Záver

V tomto tutoriáli sme videli, ako kódovať a dekódovať údaje, aby bolo možné ich správne prenášať a interpretovať. Zatiaľ čo sa článok zameral na kódovanie / dekódovanie hodnôt parametrov dotazu URI, prístup sa týka aj parametrov formulára HTML.

Zdrojový kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found