ÐбÑдований ÐºÐ»Ð°Ñ URL Ð½Ð°Ð´Ð°Ñ Ð·ÑÑÑний ÑнÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ Ñа ÑозбиÑÐ°Ð½Ð½Ñ URL на ÑаÑÑини.
ÐазвиÑай, Ñоб зÑобиÑи меÑежевий запиÑ, доÑÑаÑнÑо пеÑедаÑи лиÑе ÑÑдок з адÑеÑоÑ, пеÑедаваÑи Ñаме екземплÑÑ ÐºÐ»Ð°ÑÑ URL не Ð¼Ð°Ñ Ð¶Ð¾Ð´Ð½Ð¾Ñ Ð¿Ð¾ÑÑеби. Ð¢Ð¾Ð¼Ñ Ð½Ð°Ñ Ð½ÑÑ
Ñо не зобовâÑзÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи ÐºÐ»Ð°Ñ URL. Ðле ÑÐ½Ð¾Ð´Ñ Ñе може ÑÑаÑи в нагодÑ.
СÑвоÑÐµÐ½Ð½Ñ URL
СинÑакÑÐ¸Ñ Ð´Ð»Ñ ÑÑвоÑÐµÐ½Ð½Ñ URL обâÑкÑÑв:
new URL(url, [base])
urlâ повний URL Ñи, ÑкÑо задано дÑÑгий паÑамеÑÑ, ÑÑлÑки ÑлÑÑ (дивиÑÑ Ð´Ð°Ð»Ñ),baseâ необовâÑзковий паÑамеÑÑ Ð· âоÑновоÑâ вÑдноÑно ÑÐºÐ¾Ñ Ð±Ñде побÑдовано URL, ÑкÑо в пеÑÑÐ¾Ð¼Ñ Ð¿Ð°ÑамеÑÑÑ Ð¿ÐµÑедано ÑÑлÑки ÑлÑÑ .
ÐапÑиклад:
let url = new URL('https://javascript.info/profile/admin');
Ð Ð¾Ð±Ð¾Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ Ð±Ñде згенеÑовано Ð¾Ð´Ð½Ð°ÐºÐ¾Ð²Ñ URL:
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
Ðожна легко ÑÑвоÑиÑи новий URL Ñз ÑлÑÑ Ñ ÒÑÑнÑÑÑÑиÑÑ Ð½Ð° URL, Ñо вже ÑÑнÑÑ:
let url = new URL('https://javascript.info/profile/admin');
let newUrl = new URL('tester', url);
alert(newUrl); // https://javascript.info/profile/tester
ÐбâÑÐºÑ URL дозволÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¾ оÑÑимаÑи доÑÑÑп до його ÑкладовиÑ
, ÑÐ¾Ð¼Ñ Ñе зÑÑÑний ÑпоÑÑб Ð´Ð»Ñ ÑозбоÑÑ URL адÑеÑи:
let url = new URL('https://javascript.info/url');
alert(url.protocol); // https:
alert(url.host); // javascript.info
alert(url.pathname); // /url
ÐÑдказка Ð·Ñ Ñкладовими URL обâÑкÑÑ:
hrefповна URL-адÑеÑа, Ñе ж Ñаме, Ñоurl.toString()protocolпÑоÑокол, закÑнÑÑÑÑÑÑÑ Ñимволом двокÑапки:searchâ ÑÑдок з паÑамеÑÑами, поÑинаÑÑÑÑÑ Ñимволом Ð·Ð½Ð°ÐºÑ Ð·Ð°Ð¿Ð¸ÑаннÑ?hashпоÑинаÑÑÑÑÑ Ñимволом ÑеÑÑÑки#- Ñакож можÑÑÑ Ð±ÑÑи пÑиÑÑÑÐ½Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ
userÑаpassword, ÑкÑо викоÑиÑÑовÑÑÑÑÑÑ ÑоÑÐ¼Ð°Ñ Ð´Ð»Ñ HTTP аÑÑенÑиÑÑкаÑÑÑ:http://login:[email protected](не згадано виÑе, бо ÑÑдко викоÑиÑÑовÑÑÑÑÑÑ).
URL обâÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð° пеÑедаÑи Ñ Ð¼ÐµÑоди, Ñо викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð¼ÐµÑежевиÑ
запиÑÑв замÑÑÑÑ ÑÑдкÑfetch Ñи XMLHttpRequest можÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑовÑваÑи URL обâÑкÑи майже вÑÑди, де можна пеÑедаÑи ÑÑдок з URL.
ÐазвиÑай, URL обâÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð° пеÑедаÑи в бÑдÑ-Ñкий меÑод замÑÑÑÑ ÑÑдкÑ, оÑкÑлÑки бÑлÑÑÑÑÑÑ Ð¼ÐµÑодÑв пеÑеÑвоÑÑÑÑ Ð¾Ð±âÑÐºÑ Ð² ÑÑдок, Ñо мÑÑÑиÑÑ Ð¿Ð¾Ð²Ð½Ñ URL-адÑеÑÑ.
ÐаÑамеÑÑи поÑÑÐºÑ â?â¦â
ÐÑипÑÑÑимо, нам поÑÑÑбно ÑÑвоÑиÑи URL-адÑеÑÑ Ð· заданими паÑамеÑÑами поÑÑкÑ, напÑиклад, https://google.com/search?query=JavaScript.
Ðи, звиÑайно, можемо пеÑедаÑи ÑÑ Ð² ÑÑÐ´ÐºÑ Ð· URL-адÑеÑоÑ:
new URL('https://google.com/search?query=JavaScript')
â¦Ðле паÑамеÑÑи Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи закодованими, ÑкÑо вони мÑÑÑÑÑÑ Ð¿ÑобÑли, не лаÑинÑÑÐºÑ Ñимволи ÑоÑо (бÑлÑÑе пÑо Ñе нижÑе).
ÐÑже, Ð´Ð»Ñ ÑÑого URL Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивÑÑÑÑ: url.searchParams, обâÑÐºÑ ÑÐ¸Ð¿Ñ URLSearchParams.
ÐÑн Ð½Ð°Ð´Ð°Ñ Ð·ÑÑÑÐ½Ñ Ð¼ÐµÑоди Ð´Ð»Ñ ÑобоÑи з паÑамеÑÑами поÑÑкÑ:
append(name, value)â додаÑи паÑамеÑÑ Ð· Ñменемname,delete(name)â видалиÑи паÑамеÑÑ Ð· Ñменемname,get(name)â оÑÑимаÑи знаÑÐµÐ½Ð½Ñ Ð¿Ð°ÑамеÑÑÑ Ð· Ñменемname,getAll(name)â оÑÑимаÑи вÑÑ Ð¿Ð°ÑамеÑÑи, Ñо маÑÑÑ ÑмâÑname(напÑиклад,?user=John&user=Pete),has(name)â пеÑевÑÑиÑи Ñи ÑÑнÑÑ Ð¿Ð°ÑамеÑÑ Ð· Ñменемname,set(name, value)â вÑÑановиÑи/замÑниÑи паÑамеÑÑ Ð· Ñменемname,sort()â вÑдÑоÑÑÑваÑи паÑамеÑÑи за Ñменем, ÑÑдко ÑÑÐ°Ñ Ð² нагодÑ,- â¦Ñ Ñе обâÑÐºÑ Ñакож можна пеÑебÑаÑи, подÑбно до
Map.
ÐÑиклад з паÑамеÑÑами, Ñо мÑÑÑÑÑÑ Ð¿ÑобÑли Ñа знаки пÑнкÑÑаÑÑÑ:
let url = new URL('https://google.com/search');
url.searchParams.set('q', 'test me!'); // додано паÑамеÑÑ Ð· пÑобÑлом Ñа !
alert(url); // https://google.com/search?q=test+me%21
url.searchParams.set('tbs', 'qdr:y'); // додано паÑамеÑÑ Ð· двокÑÐ°Ð¿ÐºÐ¾Ñ :
// паÑамеÑÑи авÑомаÑиÑно закодовано
alert(url); // https://google.com/search?q=test+me%21&tbs=qdr%3Ay
// Ñ ÑÐ¸ÐºÐ»Ñ Ð¿ÐµÑебиÑаÑмо вÑÑ Ð¿Ð°ÑамеÑÑи поÑÑÐºÑ (кожен паÑамеÑÑ Ð°Ð²ÑомаÑиÑно декодÑÑÑÑÑÑ)
for(let [name, value] of url.searchParams) {
alert(`${name}=${value}`); // q=test me!, then tbs=qdr:y
}
ÐодÑваннÑ
ÐабÑÑ ÑимволÑв, Ñо можÑÑÑ Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ð¾ до викоÑиÑÑÐ°Ð½Ð½Ñ Ð² URL-адÑеÑÐ°Ñ , визнаÑено в ÑÑандаÑÑÑ RFC3986.
УÑÑ ÑнÑÑ Ñимволи, Ñо не Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ ÑÑандаÑÑом, Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи закодованÑ. ÐапÑиклад, не лаÑинÑÑÐºÑ Ð±Ñкви Ñа пÑобÑли маÑÑÑ Ð±ÑÑи замÑÐ½ÐµÐ½Ñ Ð½Ð° ÑÑ
UTF-8 коди, Ñо поÑинаÑÑÑÑÑ Ð· %. ÐÑобÑл бÑде закодовано Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ %20 (з ÑÑÑоÑиÑниÑ
пÑиÑин пÑобÑл дозволено закодÑваÑи Ñк +).
ÐаÑна новина полÑÐ³Ð°Ñ Ð² ÑомÑ, Ñо URL обâÑÐºÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ Ð²ÑÑ Ð¿ÐµÑеÑвоÑÐµÐ½Ð½Ñ Ð°Ð²ÑомаÑиÑно. Ðам поÑÑÑбно ÑÑлÑки пеÑедаÑи вÑÑ Ð¿Ð°ÑамеÑÑи, а поÑÑм пеÑеÑвоÑиÑи URL в ÑÑдок:
// Ð´Ð»Ñ Ð¿ÑÐ¸ÐºÐ»Ð°Ð´Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑано киÑилиÑÐ½Ñ Ñимволи
let url = new URL('https://uk.wikipedia.org/wiki/ТеÑÑ');
url.searchParams.set('key', 'Ñ');
alert(url); // https://uk.wikipedia.org/wiki/%D0%A2%D0%B5%D1%81%D1%82?key=%D1%97
Як баÑиÑе, Ñ Ð¢ÐµÑÑ Ñ ÑлÑÑ
Ñ, Ñ Ð¿Ð°ÑамеÑÑ Ñ Ð·Ð°ÐºÐ¾Ð´Ð¾Ð²Ð°Ð½Ð¾.
URL-адÑеÑа ÑÑала довÑоÑ, бо кожен киÑилиÑний Ñимвол пÑедÑÑавлено двома байÑами в UTF-8, ÑÐ¾Ð¼Ñ Ñам Ð´Ð²Ñ Ð³ÑÑпи ÑимволÑв %...
ÐодÑÐ²Ð°Ð½Ð½Ñ ÑÑдкÑв
Ðо поÑви URL обâÑкÑÑв, ÑозÑобники викоÑиÑÑовÑвали ÑÑдки Ð´Ð»Ñ URL-адÑеÑ.
ÐаÑазÑ, зÑÑÑнÑÑе викоÑиÑÑовÑваÑи URL обâÑкÑи, але ÑÑдки вÑе Ñе можна викоÑиÑÑовÑваÑи. У бÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв, викоÑиÑÑÐ°Ð½Ð½Ñ ÑÑдкÑв поÑÑебÑÑ Ð¼ÐµÐ½Ñе кодÑ.
СлÑд заÑважиÑи, ÑкÑо ми викоÑиÑÑовÑÑмо ÑÑдки, Ñо закодÑваÑи Ñа декодÑваÑи Ñимволи нам поÑÑÑбно вÑÑÑнÑ.
ÐÐ»Ñ ÑÑого Ñ Ð²Ð±ÑÐ´Ð¾Ð²Ð°Ð½Ñ ÑÑнкÑÑÑ:
- encodeURI â закодÑваÑи URL-адÑеÑÑ Ð¿Ð¾Ð²Ð½ÑÑÑÑ.
- decodeURI â ÑозкодÑваÑи ÑÑ.
- encodeURIComponent â закодÑваÑи ÑаÑÑÐ¸Ð½Ñ URL-адÑеÑи, напÑиклад, паÑамеÑÑи поÑÑкÑ, ÑлÑÑ Ñи Ñ ÐµÑ.
- decodeURIComponent â ÑозкодÑваÑи вÑдповÑÐ´Ð½Ñ ÑаÑÑинÑ.
Ðоже виникнÑÑи пÑиÑодне пиÑаннÑ: âЯка ÑÑзниÑÑ Ð¼Ñж encodeURIComponent Ñа encodeURI? Ðоли викоÑиÑÑовÑваÑи ÑкÑ?â
Це легÑе зÑозÑмÑÑи, ÑкÑо подивиÑиÑÑ Ð½Ð° URL-адÑеÑÑ, Ñо показано ÑоздÑÐ»ÐµÐ½Ð¾Ñ Ð½Ð° ÑаÑÑини виÑе.
https://site.com:8080/path/page?p1=v1&p2=v2#hash
Як баÑимо, Ñимволи :, ?, =, &, # дозволено безпоÑеÑеднÑо викоÑиÑÑовÑваÑи в URL.
â¦Ðа пÑоÑÐ¸Ð²Ð°Ð³Ñ ÑÑомÑ, ÑкÑо ми поглÑнемо ÑÑлÑки на паÑамеÑÑи поÑÑÐºÑ URL, Ñо викоÑиÑÑÐ°Ð½Ñ Ñам Ñимволи Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð±ÑÑи закодованÑ, Ñоб не зламаÑи ÑоÑмаÑÑваннÑ.
encodeURIкодÑÑ ÑÑлÑки Ñимволи, Ñо забоÑÐ¾Ð½ÐµÐ½Ñ Ð´Ð¾ викоÑиÑÑÐ°Ð½Ð½Ñ Ð² URL.encodeURIComponentзакодÑÑ Ð´ÐµÑÐºÑ Ñимволи Ñа Ñимволи:#,$,&,+,,,/,:,;,=,?Ñа@.
ÐÑже, Ð´Ð»Ñ ÐºÐ¾Ð´ÑÐ²Ð°Ð½Ð½Ñ Ð²ÑÑого URL можна викоÑиÑÑаÑи encodeURI:
// викоÑиÑÑÐ°Ð½Ð½Ñ ÐºÐ¸ÑилиÑниÑ
ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð² ÑлÑÑ
Ñ url
let url = encodeURI('http://site.com/пÑивÑÑ');
alert(url); // http://site.com/%D0%BF%D1%80%D0%B8%D0%B2%D1%96%D1%82
â¦ÐÑоÑе, Ð´Ð»Ñ URL паÑамеÑÑÑв нам знадобиÑÑÑÑ Ð²Ð¸ÐºÐ¾ÑиÑÑаÑи encodeURIComponent:
let music = encodeURIComponent('Rock&Roll');
let url = `https://google.com/search?q=${music}`;
alert(url); // https://google.com/search?q=Rock%26Roll
ÐоÑÑвнÑймо його з encodeURI:
let music = encodeURI('Rock&Roll');
let url = `https://google.com/search?q=${music}`;
alert(url); // https://google.com/search?q=Rock&Roll
Як баÑимо, encodeURI не кодÑÑ Ñимвол &, оÑкÑлÑки Ñе дозволений Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾ÑиÑÑÐ°Ð½Ð½Ñ Ð² URL.
Ðле нам поÑÑÑбно закодÑваÑи & вÑеÑÐµÐ´Ð¸Ð½Ñ Ð¿Ð°ÑамеÑÑÑв поÑÑкÑ, ÑнакÑе ми оÑÑимаÑмо q=Rock&Roll, Ñо ознаÑаÑиме q=Rock Ñа незÑозÑмÑлий паÑамеÑÑ Roll. Ðе Ñе, Ñо ми оÑÑкÑвали.
Ðам ÑлÑд викоÑиÑÑовÑваÑи ÑÑлÑки encodeURIComponent з паÑамеÑÑами поÑÑÐºÑ Ð´Ð»Ñ Ð¿ÑавилÑного вÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ñ Ð² ÑÑдок URL. ÐÐ»Ñ Ð¿Ð¾Ð²Ð½Ð¾Ñ Ð±ÐµÐ·Ð¿ÐµÐºÐ¸, ÑлÑд кодÑваÑи ÑмâÑ Ñа знаÑÐµÐ½Ð½Ñ Ð¿Ð°ÑамеÑÑÑв, ÑкÑо ми не можемо бÑÑи повнÑÑÑÑ Ð²Ð¿ÐµÐ²Ð½ÐµÐ½Ð¸Ð¼Ð¸, Ñо вони мÑÑÑÑÑÑ ÑÑлÑки Ð´Ð¾Ð·Ð²Ð¾Ð»ÐµÐ½Ñ Ñимволи.
URLÐлаÑи URL Ñа URLSearchParams ÒÑÑнÑÑÑÑÑÑÑ Ð½Ð° оÑÑаннÑй ÑпеÑиÑÑкаÑÑÑ URL: RFC3986, але ÑÑнкÑÑÑ encode* викоÑиÑÑовÑÑÑÑ Ð·Ð°ÑÑаÑÑÐ»Ñ Ð²ÐµÑÑÑÑ RFC2396.
ÐÑнÑÑÑÑ Ð´ÐµÑÐºÑ Ð²ÑдмÑнноÑÑÑ, Ñк Ð¾Ñ IPv6 адÑеÑи кодÑÑÑÑÑÑ Ð¿Ð¾-ÑнÑомÑ:
// valid url with IPv6 address
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]/
Як баÑимо, encodeURI замÑнила квадÑаÑÐ½Ñ Ð´Ñжки [...], Ñо Ñ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾Ñ, пÑиÑÐ¸Ð½Ð¾Ñ Ñ Ñе, Ñо IPv6 адÑеÑи Ñе не ÑÑнÑвали в ÑаÑи ÑÑвоÑÐµÐ½Ð½Ñ ÑÑандаÑÑÑ RFC2396 (ÑеÑÐ¿ÐµÐ½Ñ 1998).
Ð¢Ð°ÐºÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸ ÑÑдко ÑÑаплÑÑÑÑÑÑ, ÑÑнкÑÑÑ encode* добÑе ÑпÑавлÑÑÑÑÑÑ Ð² бÑлÑÑоÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÑв.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)