Ðа даннÑй Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¼Ñ Ñже многое знаем пÑо fetch.
ÐавайÑе ÑаÑÑмоÑÑим оÑÑавÑÑÑÑÑ ÑаÑÑÑ API, ÑÑÐ¾Ð±Ñ Ð¾Ñ Ð²Ð°ÑиÑÑ Ð²Ñе возможноÑÑи.
ÐамеÑим: болÑÑинÑÑво ÑÑиÑ
возможноÑÑей иÑполÑзÑÑÑÑÑ Ñедко. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑопÑÑÑиÑÑ ÑÑÑ Ð³Ð»Ð°Ð²Ñ Ð¸, неÑмоÑÑÑ Ð½Ð° ÑÑо, ноÑмалÑно иÑполÑзоваÑÑ fetch.
Тем не менее, полезно знаÑÑ, ÑÑо вообÑе Ð¼Ð¾Ð¶ÐµÑ fetch, ÑÑобÑ, когда поÑвиÑÑÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑÑ, веÑнÑÑÑÑÑ Ð¸ пÑоÑиÑаÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑе деÑали.
ÐижеÑледÑÑÑий ÑпиÑок â ÑÑо вÑе возможнÑе опÑии Ð´Ð»Ñ fetch Ñ ÑооÑвеÑÑÑвÑÑÑими знаÑениÑми по ÑмолÑÐ°Ð½Ð¸Ñ (в комменÑаÑиÑÑ
ÑÐºÐ°Ð·Ð°Ð½Ñ Ð°Ð»ÑÑеÑнаÑивнÑе знаÑениÑ):
let promise = fetch(url, {
method: "GET", // POST, PUT, DELETE, etc.
headers: {
// знаÑение ÑÑого заголовка обÑÑно ÑÑавиÑÑÑ Ð°Ð²ÑомаÑиÑеÑки,
// в завиÑимоÑÑи Ð¾Ñ Ñела запÑоÑа
"Content-Type": "text/plain;charset=UTF-8"
},
body: undefined, // string, FormData, Blob, BufferSource или URLSearchParams
referrer: "about:client", // или "" Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð½Ðµ поÑлаÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Referer,
// или URL Ñ ÑекÑÑего иÑÑоÑника
referrerPolicy: "strict-origin-when-cross-origin", // 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 или only-if-cached
redirect: "follow", // manual, error
integrity: "", // конÑÑолÑÐ½Ð°Ñ ÑÑмма, напÑÐ¸Ð¼ÐµÑ "sha256-abcdef1234567890"
keepalive: false, // true
signal: undefined, // AbortController, ÑÑÐ¾Ð±Ñ Ð¿ÑеÑваÑÑ Ð·Ð°Ð¿ÑоÑ
window: window // null
});
ÐоволÑно-Ñаки внÑÑиÑелÑнÑй ÑпиÑок, не Ñак ли?
Рглаве Fetch Ð¼Ñ ÑазобÑали паÑамеÑÑÑ method, headers и body.
ÐпÑÐ¸Ñ signal ÑазÑÑÑнена в главе в Fetch: пÑеÑÑвание запÑоÑа.
ТепеÑÑ Ð´Ð°Ð²Ð°Ð¹Ñе пÑойдÑмÑÑ Ð¿Ð¾ оÑÑавÑимÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑм.
referrer, referrerPolicy
ÐаннÑе опÑии опÑеделÑÑÑ, как fetch ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ HTTP-заголовок Referer.
ÐбÑÑно ÑÑÐ¾Ñ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº ÑÑавиÑÑÑ Ð°Ð²ÑомаÑиÑеÑки и ÑодеÑÐ¶Ð¸Ñ URL-адÑÐµÑ ÑÑÑаниÑÑ, Ñ ÐºÐ¾ÑоÑой пÑиÑÑл запÑоÑ. РболÑÑинÑÑве ÑлÑÑаев он ÑовÑем неважен, в некоÑоÑÑÑ ÑлÑÑаÑÑ , Ñ ÑелÑÑ Ð±Ð¾Ð»ÑÑей безопаÑноÑÑи, Ð¸Ð¼ÐµÐµÑ ÑмÑÑл ÑбÑаÑÑ Ð¸Ð»Ð¸ ÑкоÑоÑиÑÑ ÐµÐ³Ð¾.
ÐпÑÐ¸Ñ referrer позволÑÐµÑ ÑÑÑановиÑÑ Ð»Ñбой Referer в пÑеделаÑ
ÑекÑÑего иÑÑоÑника или же ÑбÑаÑÑ ÐµÐ³Ð¾.
ЧÑÐ¾Ð±Ñ Ð½Ðµ оÑпÑавлÑÑÑ Referer, нÑжно ÑказаÑÑ Ð·Ð½Ð°Ñением пÑÑÑÑÑ ÑÑÑокÑ:
fetch('/page', {
referrer: "" // не ÑÑавиÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Referer
});
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ Ð´ÑÑгой URL-адÑÐµÑ (должен бÑÑÑ Ñ ÑекÑÑего иÑÑоÑника):
fetch('/page', {
// пÑедположим, ÑÑо Ð¼Ñ Ð½Ð°Ñ
одимÑÑ Ð½Ð° ÑÑÑаниÑе https://javascript.info
// Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑÑановиÑÑ Ð»Ñбое знаÑение Referer пÑи ÑÑловии, ÑÑо оно пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ ÑекÑÑÐµÐ¼Ñ Ð¸ÑÑоÑникÑ
referrer: "https://javascript.info/anotherpage"
});
ÐпÑÐ¸Ñ referrerPolicy ÑÑÑÐ°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°ÐµÑ Ð¾Ð±Ñие пÑавила Ð´Ð»Ñ Referer.
ÐÑделÑеÑÑÑ 3 Ñипа запÑоÑов:
- ÐапÑÐ¾Ñ Ð½Ð° ÑÐ¾Ñ Ð¶Ðµ иÑÑоÑник.
- ÐапÑÐ¾Ñ Ð½Ð° дÑÑгой иÑÑоÑник.
- ÐапÑÐ¾Ñ Ñ HTTPS to HTTP (Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñного пÑоÑокола на небезопаÑнÑй).
РоÑлиÑие Ð¾Ñ Ð½Ð°ÑÑÑойки referrer, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ ÑоÑное знаÑение Referer, наÑÑÑойка referrerPolicy ÑообÑÐ°ÐµÑ Ð±ÑаÑзеÑÑ Ð¾Ð±Ñие пÑавила, ÑÑо делаÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ Ñипа запÑоÑа.
ÐозможнÑе знаÑÐµÐ½Ð¸Ñ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² ÑпеÑиÑикаÑии Referrer Policy:
"strict-origin-when-cross-origin"â знаÑение по ÑмолÑаниÑ: длÑ"same-origin"оÑпÑавлÑÑÑ Ð¿Ð¾Ð»Ð½ÑйReferer, длÑ"cross-origin"оÑпÑавлÑÑÑ ÑолÑко"origin", еÑли ÑолÑко ÑÑо не HTTPSâHTTP запÑоÑ, Ñогда не оÑпÑавлÑÑÑ Ð½Ð¸Ñего."no-referrer-when-downgrade"â вÑегда оÑпÑавлÑÑÑ Ð¿Ð¾Ð»Ð½ÑйReferer, за иÑклÑÑением ÑлÑÑаев, когда Ð¼Ñ Ð¾ÑпÑавлÑем запÑÐ¾Ñ Ñ HTTPS на HTTP (на менее безопаÑнÑй пÑоÑокол)."no-referrer"â никогда не оÑпÑавлÑÑÑReferer."origin"â оÑпÑавлÑÑÑ Ð²RefererÑолÑко ÑекÑÑий иÑÑоÑник, а не полнÑй URL-адÑÐµÑ ÑÑÑаниÑÑ, напÑимеÑ, поÑÑлаÑÑ ÑолÑкоhttp://site.comвмеÑÑоhttp://site.com/path."origin-when-cross-origin"â оÑпÑавлÑÑÑ Ð¿Ð¾Ð»Ð½ÑйRefererÐ´Ð»Ñ Ð·Ð°Ð¿ÑоÑов в пÑÐµÐ´ÐµÐ»Ð°Ñ ÑекÑÑего иÑÑоÑника, но Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на дÑÑгой иÑÑоÑник оÑпÑавлÑÑÑ ÑолÑко Ñам иÑÑоÑник (как вÑÑе)."same-origin"â оÑпÑавлÑÑÑ Ð¿Ð¾Ð»Ð½ÑйRefererÐ´Ð»Ñ Ð·Ð°Ð¿ÑоÑов в пÑÐµÐ´ÐµÐ»Ð°Ñ ÑекÑÑего иÑÑоÑника, а Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на дÑÑгой иÑÑоÑник не оÑпÑавлÑÑÑ ÐµÐ³Ð¾ вообÑе."strict-origin"â оÑпÑавлÑÑÑ ÑолÑко знаÑение иÑÑоÑника, не оÑпÑавлÑÑÑRefererÐ´Ð»Ñ HTTPSâHTTP запÑоÑов."unsafe-url"â вÑегда оÑпÑавлÑÑÑ Ð¿Ð¾Ð»Ð½Ñй URL-адÑÐµÑ Ð²Referer, даже пÑи запÑоÑаÑHTTPSâHTTP.
ÐÐ¾Ñ ÑаблиÑа Ñо вÑеми комбинаÑиÑми:
| ÐнаÑение | Ðа ÑÐ¾Ñ Ð¶Ðµ иÑÑоÑник | Ðа дÑÑгой иÑÑоÑник | HTTPSâHTTP |
|---|---|---|---|
"no-referrer" |
- | - | - |
"no-referrer-when-downgrade" |
full | full | - |
"origin" |
origin | origin | origin |
"origin-when-cross-origin" |
full | origin | origin |
"same-origin" |
full | - | - |
"strict-origin" |
origin | origin | - |
"strict-origin-when-cross-origin" или "" (по ÑмолÑаниÑ) |
full | origin | - |
"unsafe-url" |
full | full | full |
ÐопÑÑÑим, Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð°Ð´Ð¼Ð¸Ð½ÐºÐ° Ñо ÑÑÑÑкÑÑÑой URL, коÑоÑÐ°Ñ Ð½Ðµ должна ÑÑаÑÑ Ð¸Ð·Ð²ÐµÑÑной ÑнаÑÑжи ÑайÑа.
ÐÑли Ð¼Ñ Ð¾ÑпÑавлÑем запÑÐ¾Ñ fetch, Ñо по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ð½ вÑегда оÑпÑавлÑÐµÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²Ð¾Ðº Referer Ñ Ð¿Ð¾Ð»Ð½Ñм URL-адÑеÑом наÑей админки (иÑклÑÑение â ÑÑо когда Ð¼Ñ Ð´ÐµÐ»Ð°ÐµÐ¼ запÑÐ¾Ñ Ð¾Ñ HTTPS в HTTP, в Ñаком ÑлÑÑае Referer не бÑÐ´ÐµÑ Ð¾ÑпÑавлÑÑÑÑÑ).
ÐапÑимеÑ, Referer: https://javascript.info/admin/secret/paths.
ÐÑли Ð¼Ñ Ñ Ð¾Ñим, ÑÑÐ¾Ð±Ñ Ð´ÑÑгие ÑайÑÑ Ð¿Ð¾Ð»ÑÑали ÑолÑко иÑÑоÑник, но не URL-пÑÑÑ, ÑÑо ÑÐ´ÐµÐ»Ð°ÐµÑ ÑÐ°ÐºÐ°Ñ Ð½Ð°ÑÑÑойка:
fetch('https://another.com/page', {
// ...
referrerPolicy: "origin-when-cross-origin" // Referer: https://javascript.info
});
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ поÑÑавиÑÑ ÐµÑ Ð²Ð¾ вÑе вÑÐ·Ð¾Ð²Ñ fetch, возможно, инÑегÑиÑоваÑÑ Ð² JavaScript-библиоÑÐµÐºÑ Ð½Ð°Ñего пÑоекÑа, коÑоÑÐ°Ñ Ð´ÐµÐ»Ð°ÐµÑ Ð²Ñе запÑоÑÑ Ð¸ внÑÑÑи иÑполÑзÑÐµÑ fetch.
ÐдинÑÑвеннÑм оÑлиÑием в поведении бÑÐ´ÐµÑ Ñо, ÑÑо Ð´Ð»Ñ Ð²ÑеÑ
запÑоÑов на дÑÑгой иÑÑоÑник fetch бÑÐ´ÐµÑ Ð¿Ð¾ÑÑлаÑÑ ÑолÑко иÑÑоÑник в заголовке Referer (напÑимеÑ, https://javascript.info, без пÑÑи). Ð Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на Ð½Ð°Ñ Ð¸ÑÑоÑник Ð¼Ñ Ð¿Ñодолжим полÑÑаÑÑ Ð¿Ð¾Ð»Ð½Ñй Referer (ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð¾Ñладки).
fetchÐолиÑика ÑÑÑановки Referer, опиÑÐ°Ð½Ð½Ð°Ñ Ð² ÑпеÑиÑикаÑии Referrer Policy, ÑÑÑеÑÑвÑÐµÑ Ð½Ðµ ÑолÑко Ð´Ð»Ñ fetch, она более глобалÑнаÑ.
Ð ÑаÑÑноÑÑи, можно поÑÑавиÑÑ Ð¿Ð¾Ð»Ð¸ÑÐ¸ÐºÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²Ñей ÑÑÑаниÑÑ, иÑполÑзÑÑ HTTP-заголовок Referrer-Policy, или на ÑÑовне ÑÑÑлки <a rel="noreferrer">.
mode
ÐпÑÐ¸Ñ mode â ÑÑо заÑиÑа Ð¾Ñ Ð½ÐµÑаÑнной оÑпÑавки запÑоÑа на дÑÑгой иÑÑоÑник:
"cors"â ÑÑÐ¾Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, позволÑÐµÑ Ð´ÐµÐ»Ð°ÑÑ Ñакие запÑоÑÑ Ñак, как опиÑано в Fetch: запÑоÑÑ Ð½Ð° дÑÑгие ÑайÑÑ,"same-origin"â запÑоÑÑ Ð½Ð° дÑÑгой иÑÑоÑник запÑеÑенÑ,"no-cors"â ÑазÑеÑÐµÐ½Ñ ÑолÑко пÑоÑÑÑе запÑоÑÑ Ð½Ð° дÑÑгой иÑÑоÑник.
ÐÑа опÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑигодиÑÑÑÑ, еÑли URL-адÑÐµÑ Ð´Ð»Ñ fetch пÑиÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñ ÑÑеÑÑей ÑÑоÑонÑ, и нам нÑжен Ñвоего Ñода «глобалÑнÑй вÑклÑÑаÑелÑ» Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на дÑÑгие иÑÑоÑники.
credentials
ÐпÑÐ¸Ñ credentials ÑказÑваеÑ, должен ли fetch оÑпÑавлÑÑÑ ÐºÑки и авÑоÑизаÑионнÑе заголовки HTTP вмеÑÑе Ñ Ð·Ð°Ð¿ÑоÑом.
"same-origin"â ÑÑÐ¾Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, не оÑпÑавлÑÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов на дÑÑгой иÑÑоÑник,"include"â оÑпÑавлÑÑÑ Ð²Ñегда, но пÑи ÑÑом Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ заголовокAccess-Control-Allow-Credentialsв оÑвеÑе Ð¾Ñ ÑеÑвеÑа, ÑÑÐ¾Ð±Ñ JavaScript полÑÑил доÑÑÑп к оÑвеÑÑ ÑеÑвеÑа, об ÑÑом говоÑилоÑÑ Ð² главе Fetch: запÑоÑÑ Ð½Ð° дÑÑгие ÑайÑÑ,"omit"â не оÑпÑавлÑÑÑ Ð½Ð¸ пÑи ÐºÐ°ÐºÐ¸Ñ Ð¾Ð±ÑÑоÑÑелÑÑÑÐ²Ð°Ñ , даже Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑов, ÑделаннÑÑ Ð² пÑÐµÐ´ÐµÐ»Ð°Ñ ÑекÑÑего иÑÑоÑника.
cache
Ðо ÑмолÑÐ°Ð½Ð¸Ñ fetch Ð´ÐµÐ»Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ, иÑполÑзÑÑ ÑÑандаÑÑное HTTP-кеÑиÑование. То еÑÑÑ, ÑÑиÑÑваеÑÑÑ Ð·Ð°Ð³Ð¾Ð»Ð¾Ð²ÐºÐ¸ Expires, Cache-Control, оÑпÑавлÑеÑÑÑ If-Modified-Since и Ñак далее. Так же, как и обÑÑнÑе HTTP-запÑоÑÑ.
ÐаÑÑÑойка cache позволÑÐµÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ HTTP-ÐºÐµÑ Ð¸Ð»Ð¸ же наÑÑÑоиÑÑ ÐµÐ³Ð¾ иÑполÑзование:
"default"âfetchбÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÑÑандаÑÑнÑе пÑавила и заголовки HTTP кеÑиÑованиÑ,"no-store"â полноÑÑÑÑ Ð¸Ð³Ð½Ð¾ÑиÑоваÑÑ HTTP-кеÑ, ÑÑÐ¾Ñ Ñежим ÑÑановиÑÑÑ Ñежимом по ÑмолÑаниÑ, еÑли пÑиÑÑÑÑÑвÑÑÑ Ñакие заголовки какIf-Modified-Since,If-None-Match,If-Unmodified-Since,If-Match, илиIf-Range,"reload"â не бÑаÑÑ ÑезÑлÑÑÐ°Ñ Ð¸Ð· HTTP-кеÑа (даже пÑи его пÑиÑÑÑÑÑвии), но ÑÐ¾Ñ ÑаниÑÑ Ð¾ÑÐ²ÐµÑ Ð² кеÑе (еÑли ÑÑо дозволено заголовками оÑвеÑа);"no-cache"â в ÑлÑÑае, еÑли ÑÑÑеÑÑвÑÐµÑ ÐºÐµÑиÑованнÑй оÑÐ²ÐµÑ â ÑоздаÑÑ ÑÑловнÑй запÑоÑ, в пÑоÑивном же ÑлÑÑае â обÑÑнÑй запÑоÑ. Ð¡Ð¾Ñ ÑаниÑÑ Ð¾ÑÐ²ÐµÑ Ð² HTTP-кеÑе,"force-cache"â иÑполÑзоваÑÑ Ð¾ÑÐ²ÐµÑ Ð¸Ð· HTTP-кеÑа, даже еÑли он ÑÑÑаÑевÑий. ÐÑли же оÑÐ²ÐµÑ Ð² HTTP-кеÑе оÑÑÑÑÑÑвÑеÑ, ÑделаÑÑ Ð¾Ð±ÑÑнÑй HTTP-запÑоÑ, дейÑÑвоваÑÑ ÐºÐ°Ðº обÑÑно,"only-if-cached"â иÑполÑзоваÑÑ Ð¾ÑÐ²ÐµÑ Ð¸Ð· HTTP-кеÑа, даже еÑли он ÑÑÑаÑевÑий. ÐÑли же оÑÐ²ÐµÑ Ð² HTTP-кеÑе оÑÑÑÑÑÑвÑеÑ, Ñо вÑдаÑÑÑÑ Ð¾Ñибка. ÐÑо ÑабоÑаеÑ, ÑолÑко когдаmodeÑÑÑановлен в"same-origin".
redirect
ÐбÑÑно fetch пÑозÑаÑно ÑледÑÐµÑ HTTP-ÑедиÑекÑам, Ñаким как 301, 302 и Ñак далее.
ÐÑо можно поменÑÑÑ Ð¿Ñи помоÑи опÑии redirect:
"follow"â ÑÑÐ¾Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, ÑледоваÑÑ HTTP-ÑедиÑекÑам,"error"â оÑибка в ÑлÑÑае HTTP-ÑедиÑекÑа,"manual"â не ÑледоваÑÑ HTTP-ÑедиÑекÑÑ, но ÑÑÑановиÑÑ Ð°Ð´ÑÐµÑ ÑедиÑекÑа вresponse.url, аresponse.redirectedбÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñениеfalse, ÑÑÐ¾Ð±Ñ Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ ÑделаÑÑ Ð¿ÐµÑенапÑавление на новÑй адÑÐµÑ Ð²ÑÑÑнÑÑ.
integrity
ÐпÑÐ¸Ñ integrity позволÑÐµÑ Ð¿ÑовеÑиÑÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ оÑÐ²ÐµÑ Ð¸Ð·Ð²ÐµÑÑной заÑанее конÑÑолÑной ÑÑмме.
Ðак опиÑано в ÑпеÑиÑикаÑии, поддеÑживаемÑми Ñ ÐµÑ-ÑÑнкÑиÑми ÑвлÑÑÑÑÑ SHA-256, SHA-384 и SHA-512. РзавиÑимоÑÑи Ð¾Ñ Ð±ÑаÑзеÑа, могÑÑ Ð±ÑÑÑ Ð¸ дÑÑгие.
ÐапÑимеÑ, Ð¼Ñ ÑкаÑиваем Ñайл, и Ð¼Ñ ÑоÑно знаем, ÑÑо его конÑÑолÑÐ½Ð°Ñ ÑÑмма по алгоÑиÑÐ¼Ñ SHA-256 Ñавна «abcdef» (ÑазÑмееÑÑÑ, наÑÑоÑÑÐ°Ñ ÐºÐ¾Ð½ÑÑолÑÐ½Ð°Ñ ÑÑмма бÑÐ´ÐµÑ Ð´Ð»Ð¸Ð½Ð½ÐµÐµ).
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ добавиÑÑ ÑÑо в наÑÑÑÐ¾Ð¹ÐºÑ integrity Ð²Ð¾Ñ Ñак:
fetch('http://site.com/file', {
integrity: 'sha256-abcdef'
});
ÐаÑем fetch ÑамоÑÑоÑÑелÑно вÑÑиÑÐ»Ð¸Ñ SHA-256 и ÑÑÐ°Ð²Ð½Ð¸Ñ ÐµÐ³Ð¾ Ñ Ð½Ð°Ñей ÑÑÑокой. Ð ÑлÑÑае неÑооÑвеÑÑÑÐ²Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¾Ñибка.
keepalive
ÐпÑÐ¸Ñ keepalive ÑказÑÐ²Ð°ÐµÑ Ð½Ð° Ñо, ÑÑо запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Â«Ð¿ÐµÑежиÑÑ» ÑÑÑаниÑÑ, коÑоÑÐ°Ñ ÐµÐ³Ð¾ оÑпÑавила.
ÐапÑимеÑ, Ð¼Ñ ÑобиÑаем ÑÑаÑиÑÑиÑеÑкие даннÑе о Ñом, как поÑеÑиÑÐµÐ»Ñ Ð²ÐµÐ´ÑÑ ÑÐµÐ±Ñ Ð½Ð° наÑей ÑÑÑаниÑе (на ÑÑо он кликаеÑ, ÑаÑÑи ÑÑÑаниÑÑ, коÑоÑÑе он пÑоÑмаÑÑиваеÑ), Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° и ÑлÑÑÑÐµÐ½Ð¸Ñ Ð¸Ð½ÑеÑÑейÑа.
Ðогда поÑеÑиÑÐµÐ»Ñ Ð¿Ð¾ÐºÐ¸Ð´Ð°ÐµÑ Ð½Ð°ÑÑ ÑÑÑаниÑÑ â Ð¼Ñ Ñ Ð¾Ñим ÑÐ¾Ñ ÑаниÑÑ ÑобÑаннÑе даннÑе на наÑем ÑеÑвеÑе.
ÐÐ»Ñ ÑÑого Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÑобÑÑие window.onunload:
window.onunload = function() {
fetch('/analytics', {
method: 'POST',
body: "statistics",
keepalive: true
});
};
ÐбÑÑно, когда докÑÐ¼ÐµÐ½Ñ Ð²ÑгÑÑжаеÑÑÑ, вÑе ÑвÑзаннÑе Ñ Ð½Ð¸Ð¼ ÑеÑевÑе запÑоÑÑ Ð¿ÑеÑÑваÑÑÑÑ. Ðо наÑÑÑойка keepalive ÑказÑÐ²Ð°ÐµÑ Ð±ÑаÑзеÑÑ Ð²ÑполнÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð² Ñоновом Ñежиме даже поÑле Ñого, как полÑзоваÑÐµÐ»Ñ Ð¿Ð¾ÐºÐ¸Ð´Ð°ÐµÑ ÑÑÑаниÑÑ. ÐоÑÑÐ¾Ð¼Ñ ÑÑа опÑÐ¸Ñ Ð¾Ð±ÑзаÑелÑна, ÑÑÐ¾Ð±Ñ Ñакой запÑÐ¾Ñ ÑдалÑÑ.
У Ð½ÐµÑ ÐµÑÑÑ ÑÑд огÑаниÑений:
- ÐÑ Ð½Ðµ можем поÑÑлаÑÑ Ð¼ÐµÐ³Ð°Ð±Ð°Ð¹ÑÑ: Ð»Ð¸Ð¼Ð¸Ñ Ñела Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа Ñ
keepaliveâ 64кб.- ÐÑли Ð¼Ñ ÑобиÑаем болÑÑе даннÑÑ
, можем оÑпÑавлÑÑÑ Ð¸Ñ
ÑегÑлÑÑно, «пакеÑами», Ñогда на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ñледнего запÑоÑа в
onunloadÐ¸Ñ Ð¾ÑÑанеÑÑÑ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾. - ÐÑÐ¾Ñ Ð»Ð¸Ð¼Ð¸Ñ ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð½Ð° вÑе запÑоÑÑ Ñ
keepalive. То еÑÑÑ, Ð¼Ñ Ð½Ðµ можем его обойÑи, поÑлав 100 запÑоÑов одновÑеменно â каждÑй по 64ÐбайÑ.
- ÐÑли Ð¼Ñ ÑобиÑаем болÑÑе даннÑÑ
, можем оÑпÑавлÑÑÑ Ð¸Ñ
ÑегÑлÑÑно, «пакеÑами», Ñогда на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ñледнего запÑоÑа в
- ÐÑ Ð½Ðµ Ñможем обÑабоÑаÑÑ Ð¾ÑÐ²ÐµÑ Ð¾Ñ ÑеÑвеÑа, еÑли запÑÐ¾Ñ Ñделан пÑи
onunload: в ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ñже вÑгÑÑжен, его ÑÑнкÑии не ÑÑабоÑаÑÑ.- ÐбÑÑно ÑеÑÐ²ÐµÑ Ð¿Ð¾ÑÑÐ»Ð°ÐµÑ Ð¿ÑÑÑой оÑÐ²ÐµÑ Ð½Ð° Ñакие запÑоÑÑ, Ñак ÑÑо ÑÑо не ÑвлÑеÑÑÑ Ð¿Ñоблемой.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)