O’rnatilgan URL klassi URL yaratish va tahlil qilish uchun qulay interfeys taqdim etadi.
Aynan URL obyektini talab qiladigan tarmoq metodlari yo’q, stringlar yetarli. Shuning uchun texnik jihatdan URL dan foydalanishimiz shart emas. Lekin ba’zida bu juda foydali bo’lishi mumkin.
URL yaratish
Yangi URL obyektini yaratish sintaksisi:
new URL(url, [base])
url– to’liq URL yoki faqat yo’l (agar base o’rnatilgan bo’lsa, pastga qarang),base– ixtiyoriy bazaviy URL: agar o’rnatilgan bo’lsa vaurlargumenti faqat yo’lga ega bo’lsa, URLbasega nisbatan yaratiladi.
Masalan:
let url = new URL('https://javascript.info/profile/admin');
Bu ikki URL bir xil:
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
Mavjud URL ga nisbatan yo’l asosida yangi URL ni osonlik bilan yaratishimiz mumkin:
let url = new URL('https://javascript.info/profile/admin');
let newUrl = new URL('tester', url);
alert(newUrl); // https://javascript.info/profile/tester
URL obyekti darhol uning komponentlariga kirishga imkon beradi, shuning uchun bu url ni tahlil qilishning yaxshi usuli, masalan:
let url = new URL('https://javascript.info/url');
alert(url.protocol); // https:
alert(url.host); // javascript.info
alert(url.pathname); // /url
Mana URL komponentlari uchun eslatma varaqasi:
hrefto’liq url,url.toString()bilan bir xilprotocolikki nuqta belgisi:bilan tugaydisearch– parametrlar satri, savol belgisi?bilan boshlanadihashhash belgisi#bilan boshlanadi- HTTP autentifikatsiya mavjud bo’lsa
uservapasswordxususiyatlari ham bo’lishi mumkin:http://login:password@site.com(yuqorida chizilmagan, kamdan-kam ishlatiladi).
URL obyektlarini berishimiz mumkinBiz URL obyektini fetch yoki XMLHttpRequest da, URL-string kutilgan deyarli hamma joyda ishlatishimiz mumkin.
Umuman olganda, URL obyekti string o’rniga istalgan metodga berilishi mumkin, chunki ko’pchilik metodlar string konvertatsiyasini bajaradi, bu esa URL obyektini to’liq URL bilan stringga aylantiradi.
SearchParams “?…”
Faraz qilaylik, biz berilgan qidiruv parametrlari bilan url yaratmoqchimiz, masalan, https://google.com/search?query=JavaScript.
Biz ularni URL stringida berishimiz mumkin:
new URL('https://google.com/search?query=JavaScript')
…Lekin parametrlar bo’shliqlar, lotin bo’lmagan harflar va boshqalarni o’z ichiga olgan bo’lsa kodlanishi kerak (bu haqda pastda batafsil).
Buning uchun URL xususiyati bor: url.searchParams, URLSearchParams turida obyekt.
U qidiruv parametrlari uchun qulay metodlarni taqdim etadi:
append(name, value)–namebo’yicha parametr qo’shish,delete(name)–namebo’yicha parametrni o’chirish,get(name)–namebo’yicha parametrni olish,getAll(name)– bir xilnamebilan barcha parametrlarni olish (bu mumkin, masalan?user=John&user=Pete),has(name)–namebo’yicha parametrning mavjudligini tekshirish,set(name, value)– parametrni o’rnatish/almashtirish,sort()– parametrlarni nom bo’yicha tartiblash, kamdan-kam kerak,- …va u ham takrorlanuvchi,
Mapga o’xshash.
Bo’shliqlar va tinish belgilarini o’z ichiga olgan parametrlar bilan misol:
let url = new URL('https://google.com/search');
url.searchParams.set('q', 'test me!'); // bo'shliq va ! bilan parametr qo'shildi
alert(url); // https://google.com/search?q=test+me%21
url.searchParams.set('tbs', 'qdr:y'); // ikki nuqta : bilan parametr qo'shildi
// parametrlar avtomatik kodlanadi
alert(url); // https://google.com/search?q=test+me%21&tbs=qdr%3Ay
// qidiruv parametrlari bo'ylab takrorlash (dekodlangan)
for(let [name, value] of url.searchParams) {
alert(`${name}=${value}`); // q=test me!, keyin tbs=qdr:y
}
Kodlash
URL’larda qaysi belgilarga ruxsat berilgani va qaysilariga ruxsat berilmagani belgilaydigan RFC3986 standarti mavjud.
Ruxsat berilmaganlar kodlanishi kerak, masalan lotin bo’lmagan harflar va bo’shliqlar – ularning UTF-8 kodlari bilan almashtiriladi, % bilan prefiks qo’yiladi, masalan %20 (bo’shliq + bilan kodlanishi mumkin, tarixiy sabablarga ko’ra, lekin bu istisno).
Yaxshi xabar shundaki, URL obyektlari bularning barchasini avtomatik boshqaradi. Biz barcha parametrlarni kodlanmagan holda beramiz, so’ngra URL ni stringga aylantiramiz:
// bu misol uchun kirill harflaridan foydalanish
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
Ko’rib turganingizdek, url yo’lidagi Тест ham, parametrdagi ъ ham kodlangan.
URL uzunroq bo’ldi, chunki har bir kirill harfi UTF-8 da ikki bayt bilan ifodalanadi, shuning uchun ikkita %.. entity bor.
Stringlarni kodlash
Qadim zamonlarda, URL obyektlari paydo bo’lishidan oldin, odamlar URL’lar uchun stringlardan foydalanishgan.
Hozirgi kunda URL obyektlari ko’pincha qulayroq, lekin stringlar ham ishlatilishi mumkin. Ko’p hollarda string ishlatish kodni qisqartiradi.
Agar biz stringdan foydalansak, maxsus belgilarni qo’lda kodlash/dekodlash kerak.
Buning uchun o’rnatilgan funktsiyalar bor:
- encodeURI – URL ni butunlay kodlaydi.
- decodeURI – uni orqaga dekodlaydi.
- encodeURIComponent – qidiruv parametri, hash yoki pathname kabi URL komponentini kodlaydi.
- decodeURIComponent – uni orqaga dekodlaydi.
Tabiiy savol: “encodeURIComponent va encodeURI o’rtasidagi farq nima? Qachon qaysi birini ishlatishimiz kerak?”
Buni tushunish oson, agar yuqoridagi rasmda komponentlarga bo’lingan URL ga qaratsak:
https://site.com:8080/path/page?p1=v1&p2=v2#hash
Ko’rib turganingizdek, :, ?, =, &, # kabi belgilarga URL da ruxsat berilgan.
…Boshqa tomondan, agar biz qidiruv parametri kabi yagona URL komponentiga qaratsak, bu belgilar formatni buzmaslik uchun kodlanishi kerak.
encodeURIfaqat URL da butunlay taqiqlangan belgilarni kodlaydi.encodeURIComponentbir xil belgilarni kodlaydi va ularga qo’shimcha ravishda#,$,&,+,,,/,:,;,=,?va@belgilarini ham kodlaydi.
Shunday qilib, butun URL uchun biz encodeURI dan foydalanishimiz mumkin:
// url yo'lida kirill harflaridan foydalanish
let url = encodeURI('http://site.com/привет');
alert(url); // http://site.com/%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82
…URL parametrlari uchun esa encodeURIComponent dan foydalanishimiz kerak:
let music = encodeURIComponent('Rock&Roll');
let url = `https://google.com/search?q=${music}`;
alert(url); // https://google.com/search?q=Rock%26Roll
Buni encodeURI bilan solishtiring:
let music = encodeURI('Rock&Roll');
let url = `https://google.com/search?q=${music}`;
alert(url); // https://google.com/search?q=Rock&Roll
Ko’rib turganingizdek, encodeURI & ni kodlamaydi, chunki bu URL da umuman qonuniy belgi.
Lekin biz qidiruv parametri ichida & ni kodlashimiz kerak, aks holda q=Rock&Roll olamiz – bu aslida q=Rock va noma’lum Roll parametri. Niyat qilinganidek emas.
Shuning uchun har bir qidiruv parametri uchun uni URL stringga to’g’ri qo’shish uchun faqat encodeURIComponent dan foydalanishimiz kerak. Eng xavfsizi ham nom, ham qiymatni kodlash, faqat ruxsat etilgan belgilarga ega ekanligiga mutlaqo ishonch hosil qilmagan taqdirda.
URL ga nisbatan kodlash farqiURL va URLSearchParams klasslari eng so’nggi URI spetsifikatsiyasiga asoslangan: RFC3986, encode* funktsiyalar esa eski versiyaga asoslangan RFC2396.
Bir nechta farqlar bor, masalan IPv6 manzillari boshqacha kodlanadi:
// IPv6 manzili bilan yaroqli url
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]/
Ko’rib turganingizdek, encodeURI kvadrat qavslarni [...] almashtirdi, bu noto’g’ri, sababi: IPv6 url’lari RFC2396 davridai (1998-yil avgust) mavjud emas edi.
Bunday holatlar kamdan-kam uchraydi, encode* funktsiyalar ko’p vaqtda yaxshi ishlaydi.
Izohlar
<code>yorlig'ini ishlating, bir nechta satrlar uchun - ularni<pre>yorlig'i bilan o'rab qo'ying, 10 satrdan ortiq bo'lsa - sandbox (plnkr, jsbin, codepen…)