Zabudovaná tÅÃda URL poskytuje vhodné rozhranà pro vytváÅenà a parsovánà URL adres.
Žádná metoda pro práci se sÃtà nevyžaduje pÅÃmo URL objekt, vÅ¡em postaÄujà ÅetÄzce. Technicky tedy nemusÃme URL použÃvat. NÄkdy vÅ¡ak může být opravdu nápomocná.
VytvoÅenà URL
Syntaxe pro vytvoÅenà nového URL objektu je následujÃcÃ:
new URL(url, [báze])
urlâ úplná URL nebo cesta (pokud je nastavena báze, viz nÞe),bázeâ nepovinná bázová URL: pokud je nastavena a argumenturlobsahuje pouze cestu, pak se URL vygeneruje relativnÄ vůÄibáze.
PÅÃklad:
let url = new URL('https://javascript.info/profile/admin');
Tyto dvÄ URL jsou stejné:
let url1 = new URL('https://javascript.info/profile/admin');
let url2 = new URL('/profile/admin', 'https://javascript.info');
alert(url1); // https://javascript.info/profile/admin
alert(url2); // https://javascript.info/profile/admin
Můžeme snadno vytvoÅit novou URL z relativnà cesty vzhledem k existujÃcà URL:
let url = new URL('https://javascript.info/profile/admin');
let nováURL = new URL('tester', url);
alert(nováURL); // https://javascript.info/profile/tester
Objekt URL nám umožÅuje okamžitÄ pÅistupovat ke svým komponentám, takže je to pÄkný způsob, jak parsovat URL, napÅÃklad:
let url = new URL('https://javascript.info/url');
alert(url.protocol); // https:
alert(url.host); // javascript.info
alert(url.pathname); // /url
Zde je pÅehled komponent URL:
hrefje úplná URL, totéž jakourl.toString()protocolkonÄà dvojteÄkou:searchâ ÅetÄzec parametrů, zaÄÃná otaznÃkem?hashzaÄÃná znakem hashe#- pokud je pÅÃtomna HTTP autentifikace, mohou tam být i vlastnosti
user(uživatel) apassword(heslo):http://login:[email protected](v pÅehledu nezobrazeno, použÃvá se zÅÃdka).
URL můžeme pÅedávat do sÃÅ¥ových (a vÄtÅ¡iny jiných) metod mÃsto ÅetÄzcůObjekt URL můžeme použÃvat ve fetch nebo XMLHttpRequest, témÄÅ vÅ¡ude, kde je oÄekáván ÅetÄzec s URL.
ObecnÄ může být objekt URL pÅedán do libovolné metody mÃsto ÅetÄzce. VÄtÅ¡ina metod provádà konverzi na ÅetÄzec, která pÅevede objekt URL na ÅetÄzec s úplnou URL.
SearchParams â?â¦â
Dejme tomu, že chceme vytvoÅit URL se zadanými vyhledávacÃmi parametry, napÅÃklad https://google.com/search?query=JavaScript.
Můžeme je poskytnout v ÅetÄzci URL:
new URL('https://google.com/search?query=JavaScript')
â¦Parametry vÅ¡ak musejà být zakódovány, jestliže obsahujà mezery, nelatinská pÃsmena a podobnÄ (podrobnosti dále).
K tomu sloužà URL vlastnost: url.searchParams, objekt typu URLSearchParams.
Ten poskytuje vhodné metody pro vyhledávacà parametry:
append(název, hodnota)â pÅidá parametr s názvemnázev,delete(název)â odstranà parametr s názvemnázev,get(název)â vrátà parametr s názvemnázev,getAll(název)â vrátà vÅ¡echny parametry s názvemnázev(to je dovoleno, napÅ.?uživatel=Jan&uživatel=Petr),has(název)â ovÄÅà existenci parametru s názvemnázev,set(název, hodnota)â nastavà nebo nahradà parametr s názvemnázev,sort()â seÅadà parametry podle názvů, potÅebná jen zÅÃdka,- â¦a je také iterovatelný, podobnÄ jako
Map.
PÅÃklad s parametry, které obsahujà mezery a interpunkÄnà znaménka:
let url = new URL('https://google.com/search');
url.searchParams.set('q', 'otestuj mne!'); // pÅidán parametr s mezerou a vykÅiÄnÃkem !
alert(url); // https://google.com/search?q=otestuj+mne%21
url.searchParams.set('tbs', 'qdr:y'); // pÅidán parametr s dvojteÄkou :
// parametry se automaticky zakódujÃ
alert(url); // https://google.com/search?q=otestuj+mne%21&tbs=qdr%3Ay
// iterace nad vyhledávacÃmi parametry (dekódovanými)
for(let [název, hodnota] of url.searchParams) {
alert(`${název}=${hodnota}`); // q=otestuj mne!, pak tbs=qdr:y
}
KódovánÃ
Znaky, které jsou v URL povoleny a které ne, definuje standard RFC3986.
Ty, které nejsou povoleny, napÅÃklad nelatinská pÃsmena a mezery, musejà být zakódovány â nahrazeny svými UTF-8 kódy s pÅedponou %, napÅ. %20 (mezeru lze z historických důvodů zakódovat jako +, ale to je výjimka).
Dobrá zpráva je, že objekty URL to automaticky oÅ¡etÅujÃ. StaÄà pÅedat vÅ¡echny parametry nezakódované a pak pÅevést URL na ÅetÄzec:
// v tomto pÅÃkladu použijeme nÄkteré znaky z kyrilice
let url = new URL('https://ru.wikipedia.org/wiki/ТеÑÑ');
url.searchParams.set('key', 'Ñ');
alert(url); //https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%81%D1%82?key=%D1%8A
Jak vidÃte, byly zakódovány ТеÑÑ v URL cestÄ i Ñ v parametru.
URL se prodloužila, neboÅ¥ každé pÃsmeno kyrilice je v UTF-8 reprezentováno dvÄma byty, a tak pro nÄ byly vytvoÅeny dvÄ entity %...
Kódovánà ÅetÄzců
V dÅÃvÄjÅ¡Ãch dobách, než se objevily objekty URL, lidé použÃvali pro URL ÅetÄzce.
V souÄasnosti jsou objekty URL Äasto vhodnÄjÅ¡Ã, ale stále je možné použÃvat i ÅetÄzce. V mnoha pÅÃpadech pÅi použità ÅetÄzců dostaneme kratšà kód.
Pokud vÅ¡ak použÃváme ÅetÄzce, musÃme speciálnà znaky zakódovat a dekódovat ruÄnÄ.
K tomu sloužà zabudované funkce:
- encodeURI â zakóduje URL jako celek.
- decodeURI â dekóduje ji zpÄt.
- encodeURIComponent â zakóduje URL komponentu, napÅ. vyhledávacà parametr, kontrolnà souÄet nebo cestu.
- decodeURIComponent â dekóduje ji zpÄt.
Naskýtá se pÅirozená otázka: âJaký je rozdÃl mezi encodeURIComponent a encodeURI? Kdy bychom mÄli kterou z nich použÃt?"
Snadno tomu porozumÃme, když se podÃváme na URL, která je rozdÄlena na komponenty ve výše uvedeném obrázku:
https://site.com:8080/path/page?p1=v1&p2=v2#hash
Jak vidÃme, znaky jako :, ?, =, &, # jsou v URL povoleny.
â¦Naproti tomu když se podÃváme na samostatnou URL komponentu, napÅ. vyhledávacà parametr, tyto znaky musejà být zakódovány, aby se nerozbilo formátovánÃ.
encodeURIzakóduje pouze znaky, které jsou v URL zcela zakázány.encodeURIComponentzakóduje tytéž znaky a navÃc jeÅ¡tÄ znaky#,$,&,+,,,/,:,;,=,?a@.
Pro celou URL tedy můžeme použÃt encodeURI:
// použijeme v URL cestÄ znaky z kyrilice
let url = encodeURI('http://site.com/пÑивеÑ');
alert(url); // http://site.com/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
â¦ZatÃmco pro URL parametry bychom mÃsto nà mÄli použÃt encodeURIComponent:
let hudba = encodeURIComponent('Rock&Roll');
let url = `https://google.com/search?q=${hudba}`;
alert(url); // https://google.com/search?q=Rock%26Roll
Srovnejte si to s encodeURI:
let hudba = encodeURI('Rock&Roll');
let url = `https://google.com/search?q=${hudba}`;
alert(url); // https://google.com/search?q=Rock&Roll
Jak vidÃme, encodeURI nezakódovala &, protože to je v celé URL legitimnà znak.
UvnitÅ vyhledávacÃho parametru bychom vÅ¡ak mÄli & zakódovat, jinak dostaneme q=Rock&Roll â což je ve skuteÄnosti q=Rock plus nÄjaký obskurnà parametr Roll. To nenà to, co jsme zamýšleli.
Pro každý vyhledávacà parametr bychom tedy mÄli použÃvat jen encodeURIComponent, aby jej do URL ÅetÄzce vložila korektnÄ. NejbezpeÄnÄjÅ¡Ãm způsobem je zakódovat název i hodnotu, pokud si nejsme absolutnÄ jisti, že obsahujà výhradnÄ povolené znaky.
URLTÅÃdy URL a URLSearchParams jsou založeny na nejnovÄjšà specifikaci URI: RFC3986, zatÃmco funkce encode* jsou založeny na zastaralé verzi RFC2396.
Je mezi nimi nÄkolik rozdÃlů, napÅ. IPv6 adresy se zakódujà odliÅ¡nÄ:
// platná URL s IPv6 adresou
let url = 'http://[2607:f8b0:4005:802::1007]/';
alert(encodeURI(url)); // http://%5B2607:f8b0:4005:802::1007%5D/
alert(new URL(url)); // http://[2607:f8b0:4005:802::1007]/
Jak vidÃme, encodeURI nahradila hranaté závorky [...], což nenà korektnÃ. Důvodem je, že IPv6 URL v dobÄ vzniku RFC2396 (srpen 1998) jeÅ¡tÄ neexistovaly.
Takové pÅÃpady jsou vÅ¡ak vzácné, vÄtÅ¡inou funkce encode* fungujà správnÄ.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)