ÐÑÑÑоеннÑй клаÑÑ URL пÑедоÑÑавлÑÐµÑ ÑдобнÑй инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ ÑазбоÑа URL-адÑеÑов.
ÐÐµÑ ÑеÑевÑÑ
меÑодов, коÑоÑÑе ÑÑебÑÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ обÑÐµÐºÑ URL, обÑÑнÑе ÑÑÑоки вполне подÑ
одÑÑ. Так ÑÑо, ÑеÑ
ниÑеÑки, Ð¼Ñ Ð½Ðµ обÑÐ·Ð°Ð½Ñ Ð¸ÑполÑзоваÑÑ URL. Ðо иногда он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²ÐµÑÑма ÑдобнÑм.
Создание URL
СинÑакÑÐ¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ обÑекÑа URL:
new URL(url, [base])
urlâ полнÑй URL-адÑÐµÑ Ð¸Ð»Ð¸ ÑолÑко пÑÑÑ, еÑли Ñказан вÑоÑой паÑамеÑÑ,baseâ необÑзаÑелÑнÑй «базовÑй» URL: еÑли Ñказан и аÑгÑменÑ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, поÑÑÐ¾Ð¼Ñ ÑÑо оÑлиÑнÑй ÑпоÑоб «ÑазобÑаÑÑ» 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 в ÑеÑевÑе меÑÐ¾Ð´Ñ (и болÑÑинÑÑво дÑÑгиÑ
) вмеÑÑо ÑÑÑокÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Ð¾Ð±ÑÐµÐºÑ URL в меÑодаÑ
fetch или XMLHttpRequest и поÑÑи во вÑеÑ
дÑÑгиÑ
, где ожидаеÑÑÑ URL-ÑÑÑока.
ÐообÑе, обÑÐµÐºÑ URL можно пеÑедаваÑÑ Ð¿Ð¾ÑÑи кÑда Ñгодно вмеÑÑо ÑÑÑоки, Ñак как болÑÑинÑÑво меÑодов ÑконвеÑÑиÑÑÑÑ Ð¾Ð±ÑÐµÐºÑ Ð² ÑÑÑокÑ, пÑи ÑÑом он ÑÑÐ°Ð½ÐµÑ ÑÑÑокой Ñ Ð¿Ð¾Ð»Ð½Ñм URL-адÑеÑом.
SearchParams «?â¦Â»
ÐопÑÑÑим, Ð¼Ñ Ñ
оÑим ÑоздаÑÑ URL-адÑÐµÑ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми паÑамеÑÑами, напÑимеÑ, https://google.com/search?query=JavaScript.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ ÑказаÑÑ Ð¸Ñ Ð² ÑÑÑоке:
new URL('https://google.com/search?query=JavaScript')
â¦Ðо паÑамеÑÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿ÑавилÑно закодиÑованÑ, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ могли ÑодеÑжаÑÑ Ð½Ðµ-лаÑинÑкие бÑквÑ, пÑÐ¾Ð±ÐµÐ»Ñ Ð¸ Ñ.п. (об ÑÑом подÑобнее далее).
Так ÑÑо Ð´Ð»Ñ ÑÑого еÑÑÑ ÑвойÑÑво url.searchParams â обÑÐµÐºÑ Ñипа URLSearchParams.
Ðн пÑедоÑÑавлÑÐµÑ ÑдобнÑе меÑÐ¾Ð´Ñ Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¿Ð°ÑамеÑÑами:
append(name, value)â добавиÑÑ Ð¿Ð°ÑамеÑÑ Ð¿Ð¾ имени,delete(name)â ÑдалиÑÑ Ð¿Ð°ÑамеÑÑ Ð¿Ð¾ имени,get(name)â полÑÑиÑÑ Ð¿Ð°ÑамеÑÑ Ð¿Ð¾ имени,getAll(name)â полÑÑиÑÑ Ð²Ñе паÑамеÑÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñм именемname(Ñакое возможно, напÑимеÑ:?user=John&user=Pete),has(name)â пÑовеÑиÑÑ Ð½Ð°Ð»Ð¸Ñие паÑамеÑÑа по имени,set(name, value)â задаÑÑ/замениÑÑ Ð¿Ð°ÑамеÑÑ,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?query=test+me%21&tbs=qdr%3Ay
// пеÑебÑаÑÑ Ð¿Ð°ÑамеÑÑÑ (в иÑÑ
одном виде)
for(let [name, value] of url.searchParams) {
alert(`${name}=${value}`); // q=test me!, далее tbs=qdr:y
}
ÐодиÑование
СÑÑеÑÑвÑÐµÑ ÑÑандаÑÑ RFC3986, коÑоÑÑй опÑеделÑÐµÑ ÑпиÑок ÑазÑеÑÑннÑÑ Ð¸ запÑеÑÑннÑÑ Ñимволов в URL.
ÐапÑеÑÑннÑе ÑимволÑ, напÑимеÑ, нелаÑинÑкие бÑÐºÐ²Ñ Ð¸ пÑобелÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²Ð°Ð½Ñ â Ð·Ð°Ð¼ÐµÐ½ÐµÐ½Ñ ÑооÑвеÑÑÑвÑÑÑими кодами UTF-8 Ñ Ð¿ÑеÑикÑом %, напÑимеÑ: %20 (иÑÑоÑиÑеÑки ÑложилоÑÑ Ñак, ÑÑо пÑобел в URL-адÑеÑе можно Ñакже кодиÑоваÑÑ Ñимволом +, но ÑÑо иÑклÑÑение).
Ð ÑÑаÑÑÑÑ, обÑекÑÑ URL делаÑÑ Ð²ÑÑ ÑÑо авÑомаÑиÑеÑки. ÐÑ Ð¿ÑоÑÑо ÑказÑваем паÑамеÑÑÑ Ð² обÑÑном, незакодиÑованном, виде, а заÑем конвеÑÑиÑÑем URL в ÑÑÑокÑ:
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
Ðак видно, Ñлово ТеÑÑ Ð² пÑÑи URL-адÑеÑа и бÑква Ñ Ð² паÑамеÑÑе закодиÑованÑ.
URL ÑÑал длиннее, Ñак как ÐºÐ°Ð¶Ð´Ð°Ñ ÐºÐ¸ÑиллиÑеÑÐºÐ°Ñ Ð±Ñква пÑедÑÑавлÑеÑÑÑ Ð´Ð²ÑÐ¼Ñ Ð±Ð°Ð¹Ñами в кодиÑовке UTF-8.
ÐодиÑование в ÑÑÑокаÑ
РанÑÑе, до Ñого как поÑвилиÑÑ Ð¾Ð±ÑекÑÑ URL, лÑди иÑполÑзовали Ð´Ð»Ñ URL-адÑеÑов обÑÑнÑе ÑÑÑоки.
СейÑÐ°Ñ URL ÑаÑÑо Ñдобнее, но ÑÑÑоки вÑÑ ÐµÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ иÑполÑзоваÑÑ. Ðо многиÑ
ÑлÑÑаÑÑ
код Ñ Ð½Ð¸Ð¼Ð¸ коÑоÑе.
Ðднако, еÑли Ð¼Ñ Ð¸ÑполÑзÑем ÑÑÑокÑ, Ñо надо Ñамим позабоÑиÑÑÑÑ Ð¾ кодиÑовании ÑпеÑиалÑнÑÑ Ñимволов.
ÐÐ»Ñ ÑÑого еÑÑÑ Ð²ÑÑÑоеннÑе ÑÑнкÑии:
- encodeURI â кодиÑÑÐµÑ URL-адÑÐµÑ Ñеликом.
- decodeURI â декодиÑÑÐµÑ URL-адÑÐµÑ Ñеликом.
- encodeURIComponent â кодиÑÑÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ URL, напÑимеÑ, паÑамеÑÑ, Ñ ÐµÑ, Ð¸Ð¼Ñ Ð¿ÑÑи и Ñ.п.
- decodeURIComponent â декодиÑÑÐµÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ URL.
ÐÐ¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ ÐµÑÑеÑÑвеннÑй вопÑоÑ: «ÐÐ°ÐºÐ°Ñ ÑазниÑа Ð¼ÐµÐ¶Ð´Ñ encodeURIComponent и encodeURI? Ðогда иÑполÑзоваÑÑ Ð¾Ð´Ð½Ñ Ð¸ дÑÑгÑÑ ÑÑнкÑиÑ?»
ÐÑо легко понÑÑÑ, еÑли Ð¼Ñ Ð¿Ð¾ÑмоÑÑим на URL-адÑеÑ, ÑазбиÑÑй на компоненÑÑ Ð½Ð° ÑиÑÑнке вÑÑе:
http://site.com:8080/path/page?p1=v1&p2=v2#hash
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, в URL-адÑеÑе ÑазÑеÑÐµÐ½Ñ ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ :, ?, =, &, #.
â¦Ð¡ дÑÑгой ÑÑоÑонÑ, еÑли взглÑнÑÑÑ Ð½Ð° один компоненÑ, напÑимеÑ, URL-паÑамеÑÑ, Ñо в нÑм Ñакие ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°ÐºÐ¾Ð´Ð¸ÑованÑ, ÑÑÐ¾Ð±Ñ Ð½Ðµ поломаÑÑ ÑоÑмаÑиÑование.
encodeURIкодиÑÑÐµÑ ÑолÑко ÑимволÑ, полноÑÑÑÑ Ð·Ð°Ð¿ÑеÑÑннÑе в URL.encodeURIComponentкодиÑÑÐµÑ ÑÑи же ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿Ð»ÑÑ, в дополнение к ним, ÑимволÑ#,$,&,+,,,/,:,;,=,?и@.
Так ÑÑо Ð´Ð»Ñ URL Ñеликом можно иÑполÑзоваÑÑ encodeURI:
let url = encodeURI('http://site.com/пÑивеÑ');
alert(url); // http://site.com/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
â¦Ð Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑов лÑÑÑе бÑÐ´ÐµÑ Ð²Ð·ÑÑÑ 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. Ðе Ñо, ÑÑо пÑедполагалоÑÑ.
ЧÑÐ¾Ð±Ñ Ð¿ÑавилÑно вÑÑавиÑÑ Ð¿Ð°ÑамеÑÑ Ð¿Ð¾Ð¸Ñка в ÑÑÑÐ¾ÐºÑ URL, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ ÑолÑко encodeURIComponent. Ðаиболее безопаÑно кодиÑоваÑÑ Ð¸ имÑ, и знаÑение, за иÑклÑÑением ÑлÑÑаев, когда Ð¼Ñ Ð°Ð±ÑолÑÑно ÑвеÑÐµÐ½Ñ Ð² Ñом, ÑÑо они ÑодеÑÐ¶Ð°Ñ ÑолÑко ÑазÑеÑÑннÑе ÑимволÑ.
URLÐлаÑÑÑ URL и URLSearchParams базиÑÑÑÑÑÑ Ð½Ð° поÑледней ÑпеÑиÑикаÑии URI, опиÑÑваÑÑей ÑÑÑÑойÑÑво адÑеÑов: RFC3986, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑÑнкÑии encode* â на ÑÑÑаÑевÑей веÑÑии ÑÑандаÑÑа RFC2396.
РазлиÑий мало, но они еÑÑÑ, напÑимеÑ, по-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ ÐºÐ¾Ð´Ð¸ÑÑÑÑÑÑ Ð°Ð´ÑеÑа IPv6:
// допÑÑÑимÑй URL-адÑÐµÑ IPv6
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 заменила квадÑаÑнÑе Ñкобки [...], Ñделав адÑÐµÑ Ð½ÐµÐºÐ¾ÑÑекÑнÑм. ÐÑиÑина: URL-адÑеÑа IPv6 не ÑÑÑеÑÑвовали в Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑандаÑÑа RFC2396 (авгÑÑÑ 1998).
Тем не менее, Ñакие ÑлÑÑаи Ñедки. Ðо болÑÑей ÑаÑÑи ÑÑнкÑии encode* ÑабоÑаÑÑ Ñ
оÑоÑо.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)