ããã¾ã§ã®è¨äºã§ãç§ãã¡ã¯ fetch ã«ã¤ãã¦å¤ãã®ãã¨ãç¥ã£ã¦ãã¾ãã
ããã§ã¯ããã®ãã¹ã¦ã®æ©è½ãã«ãã¼ããããã«ãAPI ã®æ®ãã®é¨åãè¦ã¦ããã¾ãããã
以ä¸ã¯ãæå®å¯è½ãªãã¹ã¦ã® fetch ãªãã·ã§ã³ã¨ãã®ããã©ã«ãå¤(ã³ã¡ã³ãã¯ä»ã®é¸æè¢ã§ã)ã®ãªã¹ãã§ãã:
let promise = fetch(url, {
method: "GET", // POST, PUT, DELETE, etc.
headers: {
"Content-Type": "text/plain;charset=UTF-8" // æååã®æ¬æã®å ´å, æ¬æã«ä¾åãã¾ã
},
body: undefined // æåå, FormData, Blob, BufferSource, ããã㯠URLSearchParams
referrer: "about:client", // no-referrer ã®å ´å㯠"", ãããã¯ç¾å¨ã®ãªãªã¸ã³ã® 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, or only-if-cached
redirect: "follow", // manual, error
integrity: "", // "sha256-abcdef1234567890" ã®ãããªããã·ã¥
keepalive: false, // true
signal: undefined, // ãªã¯ã¨ã¹ãã䏿¢ããããã® AbortController
window: window // null
});
ãã£ãã¿ã¼ è¨äº "fetch-basics" ãè¦ã¤ããã¾ãã ã§ method, headers ãã㦠body ã詳ãã説æãã¾ããã
signal ãªãã·ã§ã³ã¯ Fetch: Abort ã§èª¬æãã¦ãã¾ãã
ããã§ã¯ããªãã·ã§ã³ã®æ®ãã調ã¹ã¦ã¿ã¾ãããã
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 ã«å¯¾ããä¸è¬çãªã«ã¼ã«ãè¨å®ãã¾ãã
æå®å¯è½ãªå¤ã¯Referrer Policy specificationã§èª¬æããã¦ãã¾ã:
"no-referrer-when-downgrade"â ããã©ã«ãå¤: HTTPS ãã HTTP (ããå®å ¨æ§ã®ä½ããããã³ã«)ã«ãªã¯ã¨ã¹ããéä¿¡ããå ´å以å¤ã¯ã常ã«Refererã¯éä¿¡ããã¾ãã"no-referrer"â ããã¦Refererãéä¿¡ãã¾ããã"origin"âRefererã«ã¯å®å ¨ãªãã¼ã¸URLã§ã¯ãªãããªãªã¸ã³ã®ã¿ãéä¿¡ãã¾ããä¾ãã°ãhttp://site.com/pathã®ä»£ããã«http://site.comã"origin-when-cross-origin"â åããªãªã¸ã³ã«ã¯å®å ¨ãª referrer ãéä¿¡ãã¾ãããã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã®å ´åã¯ãªãªã¸ã³é¨åã®ã¿ãéä¿¡ãã¾ãã"same-origin"â åããªãªã¸ã³ã«ã¯å®å ¨ãª referrer ãéä¿¡ãã¾ãããã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã®å ´å㯠referrer ãéä¿¡ãã¾ããã"strict-origin"â ãªãªã¸ã³ã®ã¿ãéä¿¡ããHTTPSâHTTP ã®ãªã¯ã¨ã¹ãã®å ´åã«ã¯ referrer ãéä¿¡ãã¾ããã"strict-origin-when-cross-origin"â åããªãªã¸ã³ã®å ´åã¯å®å ¨ãª referrer ãéä¿¡ããã¯ãã¹ãªãªã¸ã³ã®å ´åã¯HTTPSâHTTP ãªã¯ã¨ã¹ãã§ãªããã°ãªãªã¸ã³ã®ã¿ãéä¿¡ã HTTPSâHTTP ã®å ´åã¯ä½ãéä¿¡ãã¾ããã
å¤é¨ããã¯è¦ããã¹ãã§ãªãURLæ§é ããã¤ç®¡çè ã®åºåãããã¨ãã¾ãã
ããã¯ãã¹ãªãªã¸ã³ã® fetch ãéä¿¡ããå ´åãããã©ã«ãã§ã¯èªèº«ã®ãã¼ã¸ã®å®å
¨ãªURLãæã¤ Referer ããããéä¿¡ãã¾ã(HTTPS ãã HTTP ã¸ãªã¯ã¨ã¹ãããå ´åãé¤ãããã®å ´å㯠Referer ã¯ããã¾ãã)ã
E.g. Referer: https://javascript.info/admin/secret/paths.
referrer ãå®å ¨ã«é ãããå ´å:
fetch('https://another.com/page', {
referrerPolicy: "no-referrer" // Referer ãªãã referrer: "" ã¨åãã§ãã
});
ããã§ã¯ãªãããªã¢ã¼ãå´ã§ãªã¯ã¨ã¹ããã©ãããæ¥ãã®ãã確èªãããå ´åã«ã¯ãURLã® âãªãªã¸ã³â é¨åã ããéããã¨ãã§ãã¾ãã:
fetch('https://another.com/page', {
referrerPolicy: "strict-origin" // Referer: https://javascript.info
});
mode
mode ãªãã·ã§ã³ã¯ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ããé²ãå®å
¨è£
ç½®ã¨ãã¦æ©è½ãã¾ãã:
"cors"â ããã©ã«ããFetch: ã¯ãã¹ãªãªã¸ã³(Cross-Origin) ãªã¯ã¨ã¹ã ã§èª¬æããã¦ããããã«ãã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã¯è¨±å¯ããã¾ãã,"same-origin"â ã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã¯ç¦æ¢ããã¦ãã¾ã,"no-cors"â åç´ãªã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã®ã¿è¨±å¯ããã¦ãã¾ãã
ããã¯ãfetch URL ããµã¼ããã¼ãã£ããæ¥ããã®ã§ãã¯ãã¹ãªãªã¸ã³ã®æ©è½ãå¶éããããã« âæ©è½ããªãâ ã«ãããå ´åã«å½¹ç«ã¡ã¾ãã
credentials
credentials ãªãã·ã§ã³ã¯ãfetch ããªã¯ã¨ã¹ãã¨ä¸ç·ã« cookie 㨠HTTP-Authorization ããããéãã¹ãããæå®ãããã®ã§ãã
"same-origin"â ããã©ã«ãã§ããã¯ãã¹ãªãªã¸ã³ãªã¯ã¨ã¹ãã«å¯¾ãã¦ã¯éä¿¡ãã¾ããã"include"â 常ã«éä¿¡ããã¯ãã¹ãªãªã¸ã³ã®ãµã¼ãããAccept-Control-Allow-Credentialsãè¦æ±ãã¾ã,"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 㯠301 ã 302 ãªã©ã®ããã«ãHTTP ãªãã¤ã¬ã¯ãã«ééçã«å¾ãã¾ãã
redirect ãªãã·ã§ã³ã§ããã夿´ãããã¨ãã§ãã¾ã:
"follow"â ããã©ã«ããHTTP ãªãã¤ã¬ã¯ãã«å¾ãã¾ã,"error"â HTTP ãªãã¤ã¬ã¯ãã®å ´åã«ã¯ã¨ã©ã¼ã«ãªãã¾ãã,"manual"â HTTP ãªãã¤ã¬ã¯ãã«ã¯å¾ãã¾ããããresponse.urlãæ°ãã URL ã«ãªããresponse.redirectedãtrueã«ãªãã¾ããå¿ è¦ã«å¿ãã¦æ°ãã URL ã¸æåã§ãªãã¤ã¬ã¯ããããã¨ãã§ãã¾ãã
integrity
integrity ãªãã·ã§ã³ã¯ãã¬ã¹ãã³ã¹ãæ¢ç¥ã®ãã§ãã¯ãµã ã«ä¸è´ãããã確èªãããã¨ãã§ãã¾ãã
仿§ ã§èª¬æããã¦ããéãããµãã¼ãããã¦ããããã·ã¥é¢æ°ã¯ SHA-256, SHA-384, 㨠SHA-512 ã§ããããã©ã¦ã¶ã«ãã£ã¦ã¯ä»ã®ãã®ãããããããã¾ããã
ä¾ãã°ããã¡ã¤ã«ããã¦ã³ãã¼ããããã® SHA-256 ã®ãã§ãã¯ãµã ã âabcâ ã¨ãã¾ãï¼å®éã®ãã§ãã¯ãµã ã¯ãã¡ãããã£ã¨é·ãã§ãï¼ã
ãããæ¬¡ã®ããã«ãã¦ãintegrity ãªãã·ã§ã³ã«æå®ãããã¨ãã§ãã¾ã:
fetch('http://site.com/file', {
integrity: 'sha256-abc'
});
ããã¨ãfetch ã¯èªèº«ã§ SHA-256 ãè¨ç®ããæå忝è¼ããã¾ããä¸è´ããªãå ´åã¯ã¨ã©ã¼ãçºçãã¾ãã
keepalive
keepalive ãªãã·ã§ã³ã¯ããªã¯ã¨ã¹ãããã¼ã¸ãããé·çãããå¯è½æ§ããããã¨æå³ãã¾ãã
ä¾ãã°ãã¦ã¼ã¶ä½é¨ãåä¸ãããããã«ãç¾å¨ã®è¨ªåè ãã©ã®ããã«æã ã®ãã¼ã¸ã使ç¨ãã¦ããã(ãã¦ã¹ã¯ãªãã¯ãé²è¦§ãããã¼ã¸ã®æç ãªã©)ã«é¢ããçµ±è¨ãåéããã¨ãã¾ãã
訪åè ããã¼ã¸ãé¢ããã¨ã â ããããµã¼ãä¸ã«ä¿åãããã§ãã
window.onunload ã使ç¨ããã¨å®ç¾ã§ãã¾ã:
window.onunload = function() {
fetch('/analytics', {
method: 'POST',
body: "statistics",
keepalive: true
});
};
é常ãããã¥ã¡ã³ããã¢ã³ãã¼ããããã¨ãé¢é£ãããã¹ã¦ã®ãããã¯ã¼ã¯ãªã¯ã¨ã¹ãã¯ä¸æ¢ããã¾ããããã keepalive ãªãã·ã§ã³ã¯ããã¨ããã¼ã¸ããé¢ããå¾ã ã¨ãã¦ãããã¯ã°ã©ã³ãã§ãããå®è¡ãããããã©ã¦ã¶ã«æç¤ºãã¾ãããã®ããããªã¯ã¨ã¹ããæåããããã«ã¯ããã¯ä¸å¯æ¬ ã§ãã
- ã¡ã¬ãã¤ããéä¿¡ãããã¨ã¯ã§ãã¾ãã: keepalive ãªã¯ã¨ã¹ãã®å ´åã®æ¬æã®å¶é㯠64kb ã§ãã
- ãããããå¤ãã®ãã¼ã¿ãéããå ´åã¯ã宿çã«ãããéãã¾ããããããã°ãâonunloadâ æã®ãªã¯ã¨ã¹ãã¯å¤ãã¯ãªããªãã§ãããã
- ãã®å¶éã¯ãç¾å¨é²è¡ä¸ã®ãã¹ã¦ã®ãªã¯ã¨ã¹ãã«å¯¾ãããã®ã§ãããªã®ã§ããããã 64kb ã®ãªã¯ã¨ã¹ãã 100 å使ãããã¨ã§é¨ããã¨ãã§ãã¾ãã
- ãªã¯ã¨ã¹ãã
onunloadã§è¡ãããå ´åããµã¼ãã®å¿çã¯å¾ããã¾ããããªããªãããã¥ã¡ã³ãã¯ãã®æç¹ã§ãã§ã«ã¢ã³ãã¼ãããã¦ããããã§ãã- é常ããµã¼ãã¯ãã®ãããªãªã¯ã¨ã¹ãã«å¯¾ãã¦ã¯ç©ºã®ã¬ã¹ãã³ã¹ãè¿ãã®ã§åé¡ã¯ããã¾ããã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã