Hozirgacha biz fetch haqida ancha bilim oldik.
API ning qolgan qismini koârib chiqaylik, uning barcha imkoniyatlarini qamrab olish uchun.
Diqqat qiling: bu opsiyalarning koâpchiligi kamdan-kam ishlatiladi. Siz bu bobni oâtkazib yuborib, fetch dan yaxshi foydalanishingiz mumkin.
Shunga qaramay, fetch nima qila olishini bilish yaxshi, shuning uchun ehtiyoj tugâilsa, qaytib kelib batafsil maâlumotlarni oâqishingiz mumkin.
Mana barcha mumkin boâlgan fetch opsiyalarining toâliq roâyxati ularning standart qiymatlari bilan (izohlarda muqobillar):
let promise = fetch(url, {
method: "GET", // POST, PUT, DELETE va boshqalar.
headers: {
// content type header qiymati odatda avtomatik o'rnatiladi
// request body ga bog'liq holda
"Content-Type": "text/plain;charset=UTF-8"
},
body: undefined // string, FormData, Blob, BufferSource, yoki URLSearchParams
referrer: "about:client", // yoki Referer header yubormaslik uchun "",
// yoki joriy origin dan url
referrerPolicy: "no-referrer-when-downgrade", // no-referrer, origin, same-origin...
mode: "cors", // same-origin, no-cors
credentials: "same-origin", // omit, include
cache: "default", // no-store, reload, no-cache, force-cache, yoki only-if-cached
redirect: "follow", // manual, error
integrity: "", // hash, masalan "sha256-abcdef1234567890"
keepalive: false, // true
signal: undefined, // so'rovni to'xtatish uchun AbortController
window: window // null
});
Taâsirchan roâyxat, toâgârimi?
Biz Fetch bobida method, headers va body ni toâliq koârib chiqdik.
signal opsiyasi Fetch: To'xtatish da koârilgan.
Endi qolgan imkoniyatlarni oârganaylik.
referrer, referrerPolicy
Bu opsiyalar fetch HTTP Referer headerâini qanday oârnatishini boshqaradi.
Odatda bu header avtomatik oârnatiladi va soârov qilgan sahifaning urlâini oâz ichiga oladi. Koâpgina stsenariylarda bu umuman muhim emas, baâzida xavfsizlik maqsadida uni olib tashlash yoki qisqartirish mantiqiy.
referrer opsiyasi istalgan Referer ni (joriy origin ichida) oârnatish yoki uni olib tashlash imkonini beradi.
Hech qanday referer yubormaslik uchun boâsh string oârnating:
fetch('/page', {
referrer: "" // Referer header yo'q
});
Joriy origin ichida boshqa url oârnatish uchun:
fetch('/page', {
// https://javascript.info da ekanligimizni faraz qilamiz
// biz istalgan Referer header o'rnatishimiz mumkin, lekin faqat joriy origin ichida
referrer: "https://javascript.info/anotherpage"
});
referrerPolicy opsiyasi Referer uchun umumiy qoidalarni oârnatadi.
Soârovlar 3 turga boâlinadi:
- Bir xil origin ga soârov.
- Boshqa origin ga soârov.
- HTTPS dan HTTP ga soârov (xavfsiz protokoldan xavfsiz boâlmagan protokolga).
Aniq Referer qiymatini oârnatish imkonini beruvchi referrer opsiyasidan farqli oâlaroq, referrerPolicy brauzerga har bir soârov turi uchun umumiy qoidalarni aytadi.
Mumkin boâlgan qiymatlar Referrer Policy spetsifikatsiyasida tasvirlangan:
"no-referrer-when-downgrade"â standart qiymat: toâliqRefererhar doim yuboriladi, faqat HTTPS dan HTTP ga (kamroq xavfsiz protokolga) soârov yuborganimizda bundan mustasno."no-referrer"â hech qachonRefereryubormaslik."origin"âRefererda faqat origin yuborish, toâliq sahifa URL emas, masalanhttp://site.com/pathoârniga faqathttp://site.com."origin-when-cross-origin"â bir xil origin ga toâliqRefereryuborish, lekin cross-origin soârovlar uchun faqat origin qismi (yuqoridagidek)."same-origin"â bir xil origin ga toâliqRefereryuborish, lekin cross-origin soârovlar uchunRefereryoâq."strict-origin"â faqat origin yuborish, HTTPSâHTTP soârovlar uchunRefereryoâq."strict-origin-when-cross-origin"â same-origin uchun toâliqRefereryuborish, cross-origin uchun faqat origin, agar HTTPSâHTTP soârov boâlmasa, unda hech narsa yubormaslik."unsafe-url"â har doim toâliq url niRefererda yuborish, hatto HTTPSâHTTP soârovlar uchun ham.
Mana barcha kombinatsiyalar bilan jadval:
| Qiymat | Bir xil origin ga | Boshqa origin ga | HTTPSâHTTP |
|---|---|---|---|
"no-referrer" |
- | - | - |
"no-referrer-when-downgrade" yoki "" (standart) |
toâliq | toâliq | - |
"origin" |
origin | origin | origin |
"origin-when-cross-origin" |
toâliq | origin | origin |
"same-origin" |
toâliq | - | - |
"strict-origin" |
origin | origin | - |
"strict-origin-when-cross-origin" |
toâliq | origin | - |
"unsafe-url" |
toâliq | toâliq | toâliq |
Faraz qilaylik, bizda saytdan tashqarida maâlum boâlmasligi kerak boâlgan URL strukturasiga ega admin zonasi bor.
Agar biz fetch yuborsak, sukut boâyicha u har doim sahifamizning toâliq urlâi bilan Referer headerâini yuboradi (HTTPS dan HTTP ga soârov yuborganimizda bundan mustasno, oâshanda Referer yoâq).
Masalan Referer: https://javascript.info/admin/secret/paths.
Agar boshqa veb-saytlar faqat origin qismini bilishini istasak, URL-path ni emas, opsiyani oârnatishimiz mumkin:
fetch('https://another.com/page', {
// ...
referrerPolicy: "origin-when-cross-origin" // Referer: https://javascript.info
});
Biz buni barcha fetch chaqiruvlariga qoâyishimiz mumkin, ehtimol loyihamizdagi barcha soârovlarni bajaradigan va ichida fetch dan foydalanadigan JavaScript kutubxonasiga integratsiya qilishimiz mumkin.
Standart xatti-harakatdan yagona farqi shundaki, boshqa origin ga soârovlar uchun fetch faqat URL ning origin qismini yuboradi (masalan https://javascript.info, yoâlsiz). Bizning origin ga soârovlar uchun biz hali ham toâliq Referer ni olamiz (debug maqsadlari uchun foydali boâlishi mumkin).
fetch uchun emasSpetsifikatsiyada tasvirlangan Referrer policy faqat fetch uchun emas, balki koâproq global.
Xususan, Referrer-Policy HTTP header yordamida butun sahifa uchun standart siyosatni yoki <a rel="noreferrer"> bilan har bir havola uchun oârnatish mumkin.
mode
mode opsiyasi tasodifiy cross-origin soârovlarni oldini oluvchi himoya-qorovul:
"cors"â standart, cross-origin soârovlariga ruxsat beriladi, Fetch: Cross-Origin So'rovlarida tasvirlanganidek,"same-origin"â cross-origin soârovlari taqiqlangan,"no-cors"â faqat xavfsiz cross-origin soârovlariga ruxsat beriladi.
Bu opsiya fetch uchun URL uchinchi tomondan kelganda va cross-origin imkoniyatlarni cheklash uchun âoâchirish tugmasiâ ni xohlaganimizda foydali boâlishi mumkin.
credentials
credentials opsiyasi fetch soârov bilan cookie va HTTP-Authorization headerâlarini yuborishini belgilaydi.
"same-origin"â standart, cross-origin soârovlar uchun yubormaslik,"include"â har doim yuborish, JavaScript javobga kirishi uchun cross-origin serverdanAccept-Control-Allow-Credentialstalab qiladi, bu Fetch: Cross-Origin So'rovlari bobida koârilgan,"omit"â hech qachon yubormaslik, hatto same-origin soârovlar uchun ham.
cache
Sukut boâyicha, fetch soârovlari standart HTTP-keshlashdan foydalanadi. Yaâni, u Expires va Cache-Control headerâlarini hurmat qiladi, If-Modified-Since va boshqalarni yuboradi. Xuddi oddiy HTTP-soârovlar qilgani kabi.
cache opsiyalari HTTP-keshni eâtiborsiz qoldirish yoki uning ishlatilishini nozik sozlash imkonini beradi:
"default"âfetchstandart HTTP-kesh qoidalari va headerâlarini ishlatadi,"no-store"â HTTP-keshni butunlay eâtiborsiz qoldirish, agar bizIf-Modified-Since,If-None-Match,If-Unmodified-Since,If-Match, yokiIf-Rangeheaderâini oârnatsak, bu rejim standart boâladi,"reload"â HTTP-keshdan natija olmaydi (agar mavjud boâlsa), lekin javob bilan keshni toâldiradi (agar javob headerâlari bu harakatga ruxsat bersa),"no-cache"â keshlangan javob mavjud boâlsa shartli soârov yaratadi, aks holda oddiy soârov. HTTP-keshni javob bilan toâldiradi,"force-cache"â HTTP-keshdan javobdan foydalanadi, hatto eski boâlsa ham. Agar HTTP-keshda javob boâlmasa, oddiy HTTP-soârov qiladi, normal harakat qiladi,"only-if-cached"â HTTP-keshdan javobdan foydalanadi, hatto eski boâlsa ham. Agar HTTP-keshda javob boâlmasa, xato. Faqatmode"same-origin"boâlganda ishlaydi.
redirect
Odatda, fetch HTTP-redirectlarni (301, 302 va boshqalar) shaffof ravishda kuzatib boradi.
redirect opsiyasi buni oâzgartirishga imkon beradi:
"follow"â standart, HTTP-redirectlarni kuzatib borish,"error"â HTTP-redirect boâlsa xato,"manual"â HTTP-redirectlarni qoâlda qayta ishlash imkonini beradi. Redirect boâlsa, bizresponse.type="opaqueredirect"va nol/boâsh status va boshqa koâpgina xususiyatlar bilan maxsus javob obyektini olamiz.
integrity
integrity opsiyasi javob oldindan maâlum boâlgan checksumga mos kelishini tekshirish imkonini beradi.
Spetsifikatsiyada tasvirlanganidek, qoâllab-quvvatlanadigan hash-funktsiyalar SHA-256, SHA-384 va SHA-512, brauzerga qarab boshqalari ham boâlishi mumkin.
Masalan, biz fayl yuklamoqdamiz va uning SHA-256 checksumâi âabcdefâ ekanligini bilamiz (haqiqiy checksum uzunroq, albatta).
Biz uni integrity opsiyasiga quyidagicha qoâyishimiz mumkin:
fetch('http://site.com/file', {
integrity: 'sha256-abcdef'
});
Keyin fetch oâz-oâzidan SHA-256 ni hisoblab, bizning stringimiz bilan solishtiradi. Mos kelmaslik holatida xato yuzaga keladi.
keepalive
keepalive opsiyasi soârov uni boshlagan veb-sahifadan âuzoqroq yashashiâ mumkinligini koârsatadi.
Masalan, biz joriy tashrif buyuruvchi sahifamizni qanday ishlatiganini (sichqoncha bosilishlari, u koâradigan sahifa qismlari) toâplaymiz, foydalanuvchi tajribasini tahlil qilish va yaxshilash uchun.
Tashrif buyuruvchi sahifamizni tark etganda â biz maâlumotlarni serverimizga saqlashni xohlaymiz.
Buning uchun window.onunload eventâidan foydalanishimiz mumkin:
window.onunload = function() {
fetch('/analytics', {
method: 'POST',
body: "statistika",
keepalive: true
});
};
Odatda, hujjat yukdan tushirilganda, barcha bogâliq tarmoq soârovlari toâxtatiladi. Lekin keepalive opsiyasi brauzerga sahifani tark etgandan keyin ham soârovni fonda bajarishni aytadi. Shunday qilib, bu opsiya bizning soârovimiz muvaffaqiyatli boâlishi uchun muhim.
Uning bir nechta cheklovlari bor:
- Biz megabaytlar yubora olmaymiz:
keepalivesoârovlar uchun body chegarasi 64KB.- Agar tashrif haqida koâp statistika toâplashimiz kerak boâlsa, uni muntazam ravishda paketlarda yuborishimiz kerak, shunda oxirgi
onunloadsoârov uchun koâp narsa qolmaydi. - Bu chegara barcha
keepalivesoârovlariga birgalikda tegishli. Boshqacha qilib aytganda, biz bir nechtakeepalivesoârovlarni parallel bajarishimiz mumkin, lekin ularning body uzunliklari yigâindisi 64KB dan oshmasligi kerak.
- Agar tashrif haqida koâp statistika toâplashimiz kerak boâlsa, uni muntazam ravishda paketlarda yuborishimiz kerak, shunda oxirgi
- Hujjat yukdan tushirilgan boâlsa, server javobini boshqara olmaymiz. Shunday qilib, bizning misolimizda
keepalivetufaylifetchmuvaffaqiyatli boâladi, lekin keyingi funktsiyalar ishlamaydi.- Statistika yuborish kabi koâpgina hollarda bu muammo emas, chunki server shunchaki maâlumotlarni qabul qiladi va odatda bunday soârovlarga boâsh javob yuboradi.
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â¦)