ãã§ãã API ã®ä½¿ç¨
ãã§ãã API ã¯ãHTTP ãªã¯ã¨ã¹ããè¡ããã¬ã¹ãã³ã¹ãå¦çããããã® JavaScript ã¤ã³ã¿ã¼ãã§ã¤ã¹ãæä¾ãã¾ãã
ãã§ãã㯠XMLHttpRequest ã®ç¾ä»£ã®ç½®ãæãã§ããã³ã¼ã«ããã¯ã使ç¨ãã XMLHttpRequest ã¨ã¯ç°ãªãããã§ããã¯ãããã¹ãã¼ã¹ã§ããµã¼ãã¹ã¯ã¼ã«ã¼ããªãªã¸ã³éãªã½ã¼ã¹å
±æ (CORS) ã®ãããªç¾ä»£ã®ã¦ã§ãã®æ©è½ã¨çµ±åããã¦ãã¾ãã
ãã§ãã API ã§ã¯ãfetch() ãå¼ã³åºãã¦ãªã¯ã¨ã¹ããè¡ãã¾ãããã㯠ã¦ã£ã³ãã¦ã¨ã¯ã¼ã«ã¼ã®ä¸¡æ¹ã®ã³ã³ããã¹ãã§ã°ãã¼ãã«é¢æ°ã¨ãã¦å©ç¨ã§ãã¾ãããã®ã³ã³ããã¹ãã«ã¯ Request ãªãã¸ã§ã¯ããããã§ãããã URL ãæ ¼ç´ããæååãããã³ãªã¯ã¨ã¹ããæ§æããããã®ãªãã·ã§ã³å¼æ°ã渡ãã¾ãã
fetch() 颿°ã¯ Promise ãè¿ãã¾ãããã®ãããã¹ã¯ãµã¼ãã¼ã®ã¬ã¹ãã³ã¹ã表ã Response ãªãã¸ã§ã¯ãã§å±¥è¡ããã¾ããã¬ã¹ãã³ã¹ã«å¯¾ãã¦é©åãªã¡ã½ãããå¼ã³åºãã¨ããªã¯ã¨ã¹ãã®ã¹ãã¼ã¿ã¹ã調ã¹ãããã¬ã¹ãã³ã¹æ¬ä½ãããã¹ãã JSON ãªã©æ§ã
ãªå½¢å¼ã§åãåºããã¨ãã§ãã¾ãã
以ä¸ã¯ fetch() ã使ç¨ãã¦ãµã¼ãã¼ãã JSON ãã¼ã¿ãåå¾ããæå°éã®é¢æ°ã§ãã
async function getData() {
const url = "https://example.org/products.json";
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response.status}`);
}
const result = await response.json();
console.log(result);
} catch (error) {
console.error(error.message);
}
}
URL ãæ ¼ç´ããæååã宣è¨ããfetch() ãå¼ã³åºãã¦ãä½è¨ãªãªãã·ã§ã³ãä»ããã« URL ãæ¸¡ãã¾ãã
fetch() 颿°ã¯ä½ãã¨ã©ã¼ãããã¨ãããã¹ãæå¦ãã¾ããããµã¼ãã¼ã 404 ã®ãããªã¨ã©ã¼ã¹ãã¼ã¿ã¹ã§å¿çããå ´åã¯æå¦ãã¾ããããããã£ã¦ãã¬ã¹ãã³ã¹ã®ã¹ãã¼ã¿ã¹ã調ã¹ã¦ãOK ã§ãªãå ´åã¯ã¨ã©ã¼ã throw ãã¾ãã
ããã§ãªãå ´åã¯ãResponse ã® json() ã¡ã½ãããå¼ã³åºãã¦ãã¬ã¹ãã³ã¹æ¬ä½ã®ã³ã³ãã³ãã JSON ã¨ãã¦åå¾ãããã®å¤ã®ä¸ã¤ããã°åºåãã¾ããfetch() èªä½ã¨åæ§ã«ã json() ã¯ã¬ã¹ãã³ã¹æ¬ä½ã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ããä»ã®ãã¹ã¦ã®ã¡ã½ããã¨åæ§ã«éåæã§ãããã¨ã«æ³¨æãã¦ãã ããã
ãã®ãã¼ã¸ã®æ®ãã®é¨åã§ã¯ããã®ããã»ã¹ã®ãã¾ãã¾ãªæ®µéã詳ããè¦ã¦ããã¾ãã
ãªã¯ã¨ã¹ããè¡ã
ãªã¯ã¨ã¹ããè¡ãã«ã¯ã fetch() ãå¼ã³åºãã¦ã次ã®ãã®ã渡ãã¾ãã
- ãã§ãããããªã½ã¼ã¹ã®å®ç¾©ãããã¯ä»¥ä¸ã®ããããã§ãã
- URL ãæ ¼ç´ããæååã
URLã®ã¤ã³ã¹ã¿ã³ã¹ãªã©ã®ãªãã¸ã§ã¯ããããªãã¡ URL ãæ ¼ç´ããæååãçæããæååååã®ãããã®ãRequestã®ã¤ã³ã¹ã¿ã³ã¹ã
- ãªãã·ã§ã³ã¨ãã¦ããªã¯ã¨ã¹ããæ§æããããã®ãªãã·ã§ã³ãå«ããªãã¸ã§ã¯ãã
ãã®ç¯ã§ã¯ããã使ç¨ãããªãã·ã§ã³ãè¦ã¦ããã¾ããæå®ããããã¹ã¦ã®ãªãã·ã§ã³ã«ã¤ãã¦ã¯ãfetch() ãªãã¡ã¬ã³ã¹ãã¼ã¸ãåç
§ãã¦ãã ããã
ã¡ã½ããã®è¨å®
æ¢å®ã§ã¯ãfetch() 㯠GET ãªã¯ã¨ã¹ããè¡ãã¾ãããmethod ãªãã·ã§ã³ã使ç¨ããã°ãå¥ã®ãªã¯ã¨ã¹ãã¡ã½ããã使ç¨ãããã¨ãã§ãã¾ãã
const response = await fetch("https://example.org/post", {
method: "POST",
// â¦
});
mode ãªãã·ã§ã³ã no-cors ã«è¨å®ããã¦ããå ´åã method 㯠GETãPOSTãHEAD ã®ããããã§ãªããã°ãªãã¾ããã
æ¬ä½ã®è¨å®
ãªã¯ã¨ã¹ãæ¬ä½ã¯ãªã¯ã¨ã¹ãã®å
容ã§ããã¯ã©ã¤ã¢ã³ãããµã¼ãã¼ã«éããã®ã§ããGET ãªã¯ã¨ã¹ãã§ã¯æ¬ä½ãå«ãããã¨ã¯ã§ãã¾ããããPOST ã PUT ãªã¯ã¨ã¹ãã®ããã«ãµã¼ãã¼ã«ã³ã³ãã³ããéä¿¡ãããªã¯ã¨ã¹ãã§ã¯æçã§ããä¾ãã°ããµã¼ãã¼ã«ãã¡ã¤ã«ãã¢ãããã¼ããããå ´åãPOST ãªã¯ã¨ã¹ããè¡ãããªã¯ã¨ã¹ãæ¬ä½ã«ãã¡ã¤ã«ãå«ãããã¨ãã§ãã¾ãã
ãªã¯ã¨ã¹ãæ¬ä½ãè¨å®ããã«ã¯ãbody ãªãã·ã§ã³ã¨ãã¦æ¸¡ãã¾ãã
const response = await fetch("https://example.org/post", {
method: "POST",
body: JSON.stringify({ username: "example" }),
// â¦
});
æ¬ä½ã¯ã以ä¸ããããã®åã®ã¤ã³ã¹ã¿ã³ã¹ã¨ãã¦æå®ã§ãã¾ãã
ãã以å¤ã®ãªãã¸ã§ã¯ãã¯ãtoString() ã¡ã½ããã使ç¨ãã¦æååã«å¤æããã¾ããä¾ãã°ãURLSearchParams ãªãã¸ã§ã¯ãã使ç¨ãã¦ãã©ã¼ã ãã¼ã¿ãã¨ã³ã³ã¼ããããã¨ãã§ãã¾ãï¼è©³ç´°ã«ã¤ãã¦ã¯ãããã¼ã®è¨å®ãåç
§ãã¦ãã ããï¼ã
const response = await fetch("https://example.org/post", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
// èªåçã« "username=example&password=password" ã«å¤æããã
body: new URLSearchParams({ username: "example", password: "password" }),
// â¦
});
ã¬ã¹ãã³ã¹æ¬ä½ã¨åæ§ã«ããªã¯ã¨ã¹ãæ¬ä½ã¯ã¹ããªã¼ã ã§ããããªã¯ã¨ã¹ãã使ããã¨ã¹ããªã¼ã ãèªã¿è¾¼ãã®ã§ããªã¯ã¨ã¹ããæ¬ä½ãå«ãå ´åã2 å使ãããã¨ã¯ã§ããªããã¨ã«æ³¨æãã¦ãã ããã
const request = new Request("https://example.org/post", {
method: "POST",
body: JSON.stringify({ username: "example" }),
});
const response1 = await fetch(request);
console.log(response1.status);
// ä¾å¤ãçºç: "Body has already been consumed."
const response2 = await fetch(request);
console.log(response2.status);
ãã®ä»£ããã«ããªã¯ã¨ã¹ããéä¿¡ããåã«è¤è£½ã使ããããå¿ è¦ãããã¾ãã
const request1 = new Request("https://example.org/post", {
method: "POST",
body: JSON.stringify({ username: "example" }),
});
const request2 = request1.clone();
const response1 = await fetch(request1);
console.log(response1.status);
const response2 = await fetch(request2);
console.log(response2.status);
詳ããã¯ãããã¯ãã妨害ãããã¹ããªã¼ã ãåç §ãã¦ãã ããã
ãããã¼ã®è¨å®
ãªã¯ã¨ã¹ããããã¼ã¯ããªã¯ã¨ã¹ãã«é¢ããæ
å ±ããµã¼ãã¼ã«ä¸ãã¾ããä¾ãã° POST ãªã¯ã¨ã¹ãã®ä¸ã§ã Content-Type ãããã¼ã¯ããªã¯ã¨ã¹ãæ¬ä½ã®å½¢å¼ããµã¼ãã¼ã«æç¤ºãã¾ãã
ãªã¯ã¨ã¹ããããã¼ãè¨å®ããã«ã¯ãheaders ãªãã·ã§ã³ã«å²ãå½ã¦ã¦ãã ããã
ããã«ã¯ ãããã¼å: ãããã¼å¤ ã®å½¢ã§ããããã£ãæ ¼ç´ãããªãã¸ã§ã¯ããªãã©ã«ã渡ããã¨ãã§ãã¾ãã
const response = await fetch("https://example.org/post", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username: "example" }),
// â¦
});
ãããã¯ãHeaders ãªãã¸ã§ã¯ããæ§ç¯ããHeaders.append() ã使ç¨ãã¦ãã®ãªãã¸ã§ã¯ãã«ãããã¼ã追å ããHeaders ãªãã¸ã§ã¯ãã headers ãªãã·ã§ã³ã«å²ãå½ã¦ããã¨ãã§ãã¾ãã
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const response = await fetch("https://example.org/post", {
method: "POST",
headers: myHeaders,
body: JSON.stringify({ username: "example" }),
// â¦
});
ãã¬ã¼ã³ãªãã¸ã§ã¯ãã使ç¨ããå ´åã¨æ¯è¼ãã¦ãHeadersãªãã¸ã§ã¯ãã¯ããã«ããã¤ãã®å
¥åãµãã¿ã¤ãºæ©è½ãæä¾ãã¾ããä¾ãã°ããããã¼åãå°æåã«æ£è¦åãããããã¼å¤ã®å
é ã¨æ«å°¾ã®ç©ºç½ãåé¤ããç¹å®ã®ãããã¼ãè¨å®ãããã®ãé²ãã¾ããå¤ãã®ãããã¼ã¯ãã©ã¦ã¶ã¼ã§èªåçã«è¨å®ãããã¹ã¯ãªããã«ãã£ã¦è¨å®ãããã¨ã¯ã§ãã¾ããããããã¯ç¦æ¢ãªã¯ã¨ã¹ããããã¼ã¨å¼ã°ãã¾ãã mode ãªãã·ã§ã³ã no-cors ã«è¨å®ããã¦ããå ´åã許å¯ããããããã¼ã®ã»ããã¯ããã«å¶éããã¾ãã
GET ãªã¯ã¨ã¹ãã§ã®ãã¼ã¿ã®éä¿¡
GET ãªã¯ã¨ã¹ãã«ã¯æ¬ä½ãããã¾ããããã¯ã¨ãªã¼æååã¨ã㦠URL ã«ãã¼ã¿ã追å ãããã¨ã§ããµã¼ãã¼ã«ãã¼ã¿ãéä¿¡ã§ãã¾ããããã¯ãã©ã¼ã ãã¼ã¿ããµã¼ãã¼ã«éä¿¡ããä¸è¬çãªæ¹æ³ã§ãã URLSearchParams ã使ç¨ãã¦ãã¼ã¿ãã¨ã³ã³ã¼ããã URL ã«è¿½å ãããã¨ã§å®ç¾ã§ãã¾ãã
const params = new URLSearchParams();
params.append("username", "example");
// GET ãªã¯ã¨ã¹ã㯠https://example.org/login?username=example ã«éããã
const response = await fetch(`https://example.org/login?${params}`);
ãªãªã¸ã³éãªã¯ã¨ã¹ããè¡ã
ãªãªã¸ã³éã®ãªã¯ã¨ã¹ããã§ãããã©ãã㯠RequestInit.mode ãªãã·ã§ã³ã®å¤ã§æ±ºã¾ãã¾ãããã㯠corsãsame-originãno-cors ã® 3 ã¤ã®å¤ã®ãããããåãã¾ãã
-
ãã§ãããªã¯ã¨ã¹ãã§ã¯ã
modeã®æ¢å®å¤ã¯corsã§ããããã¯ããªã¯ã¨ã¹ãããªãªã¸ã³ãã¾ããå ´åããªãªã¸ã³éãªã½ã¼ã¹å ±æ (CORS) ã®ä»çµã¿ã使ç¨ããã¨ããæå³ã§ããå ·ä½çã«ã¯ä»¥ä¸ã®éãã§ãã- ãªã¯ã¨ã¹ããåç´ãªã¯ã¨ã¹ãã®å ´åããªã¯ã¨ã¹ãã¯å¸¸ã«éä¿¡ããã¾ããããµã¼ãã¼ã¯æ£ãã
Access-Control-Allow-Originãããã¼ã§å¿çããªããã°ãªãã¾ããã - ãªã¯ã¨ã¹ããåç´ãªãªã¯ã¨ã¹ãã§ãªãå ´åããã©ã¦ã¶ã¼ã¯ããªãã©ã¤ããªã¯ã¨ã¹ããéä¿¡ãã¦ããµã¼ãã¼ã CORS ãçè§£ãããªã¯ã¨ã¹ãã許å¯ãã¦ããã調ã¹ããµã¼ãã¼ãé©å㪠CORS ãããã¼ã§ããªãã©ã¤ããªã¯ã¨ã¹ãã«å¿çããªãéããå®éã®ãªã¯ã¨ã¹ãã¯éä¿¡ããã¾ããã
- ãªã¯ã¨ã¹ããåç´ãªã¯ã¨ã¹ãã®å ´åããªã¯ã¨ã¹ãã¯å¸¸ã«éä¿¡ããã¾ããããµã¼ãã¼ã¯æ£ãã
-
modeãsame-originã«è¨å®ããã¨ããªãªã¸ã³éã®ãªã¯ã¨ã¹ããå®å ¨ã«ç¦æ¢ãã¾ãã -
modeãno-corsã«è¨å®ããã¨ããªãªã¸ã³ãè¶ãããªã¯ã¨ã¹ãã«å¯¾ãã CORS ãç¡å¹åããã¾ããããã«ãããè¨å®å¯è½ãªãããã¼ãå¶éãããã¡ã½ãã㯠GETãHEADãPOST ã«éå®ããã¾ããã¬ã¹ãã³ã¹ã¯ä¸éæã¨ãªãããã®ãããã¼ã¨æ¬ä½ã¯ JavaScript ã§å©ç¨ã§ãã¾ãããã»ã¨ãã©ã®å ´åãã¦ã§ããµã¤ãã¯no-corsã使ç¨ãã¹ãã§ã¯ããã¾ããã主ãªç¨éã¯ç¹å®ã®ãµã¼ãã¹ã¯ã¼ã«ã¼ã®ç¨éã«éããã¾ãã
詳細ã«ã¤ãã¦ã¯ãRequestInit.mode ã®ãªãã¡ã¬ã³ã¹ããã¥ã¡ã³ããåç
§ãã¦ãã ããã
è³æ ¼æ å ±ãå«ãã
ãã§ãã API ã®ã³ã³ããã¹ãã«ããã¦ãè³æ ¼æ å ±ã¨ã¯ãªã¯ã¨ã¹ãã¨å ±ã«éä¿¡ããã追å ãã¼ã¿ã§ããããµã¼ãã¼ãã¦ã¼ã¶ã¼ã®èªè¨¼ã«ä½¿ç¨ãããã¨ãã§ãããã®ã§ããæ¬¡ã®ã¢ã¤ãã ã¯ãã¹ã¦è³æ ¼æ å ±ã¨è¦ãªããã¾ãã
- HTTP ã¯ããã¼
- TLS ã¯ã©ã¤ã¢ã³ãè¨¼ææ¸
Authorizationããã³Proxy-Authorizationãããã¼
æ¢å®ã§ã¯ãè³æ ¼æ
å ±ã¯åä¸ãªãªã¸ã³ãªã¯ã¨ã¹ãã«ã®ã¿å«ã¾ãã¾ãããã®åä½ãã«ã¹ã¿ãã¤ãºãããããã©ã¦ã¶ã¼ã Set-Cookie ã¬ã¹ãã³ã¹ãããã¼ãå°éãããã©ãããå¶å¾¡ãããããã«ã¯ãcredentials ãªãã·ã§ã³ãè¨å® ãã¦ãã ããããã®ãªãã·ã§ã³ã«ã¯ä»¥ä¸ã® 3 ã¤ã®å¤ã®ãããããæå®ã§ãã¾ãã
omit: ãªã¯ã¨ã¹ãã«è³æ ¼æ å ±ãéä¿¡ããããã¬ã¹ãã³ã¹ã«è³æ ¼æ å ±ãå«ããããã¾ãããsame-originï¼æ¢å®å¤ï¼: åä¸ãªãªã¸ã³ã®ãªã¯ã¨ã¹ãã«å¯¾ãã¦ã®ã¿è³æ ¼æ å ±ãéä¿¡ããå«ãã¾ããinclude: ãªãªã¸ã³ãã¾ããã å ´åã§ãã£ã¦ã常ã«è³æ ¼æ å ±ãå«ãã¾ãã
ã¯ããã¼ã® SameSite 屿§ã Strict ã¾ã㯠Lax ã«è¨å®ããã¦ããå ´åãcredentials ã include ã«è¨å®ããã¦ãã¦ããã¯ããã¼ã¯ãµã¤ããã¾ããã§éä¿¡ãããªããã¨ã«æ³¨æãã¦ãã ããã
ãã®ããããã¨ã credentials ã include ã«è¨å®ããã¦ãã¦ãããµã¼ãã¼ã¯ã¬ã¹ãã³ã¹ã« Access-Control-Allow-Credentials ãããã¼ãè¨è¼ãããã¨ã§ãè³æ ¼æ
å ±ãå«ãããã¨ã«åæããªããã°ãªãã¾ãããããã«ããã®ç¶æ³ã§ã¯ãµã¼ãã¼ã¯ Access-Control-Allow-Origin ã¬ã¹ãã³ã¹ãããã¼ã§ã¯ã©ã¤ã¢ã³ãã®å
ã®ãµã¼ãã¼ãæç¤ºçã«æå®ããªããã°ãªãã¾ããï¼ã¤ã¾ãã* ã¯è¨±å¯ããã¾ããï¼ã
ã¤ã¾ããcredentials ã include ã«è¨å®ããã¦ãã¦ããªã¯ã¨ã¹ãããªãªã¸ã³ãã¾ããå ´åãæ¬¡ã®ããã«ãªãã¾ãã
-
ãªã¯ã¨ã¹ãã åç´ãªã¯ã¨ã¹ãã®å ´åããªã¯ã¨ã¹ãã¯è³æ ¼æ å ±ã¨å ±ã«éä¿¡ããã¾ããããµã¼ãã¼ã¯
Access-Control-Allow-Credentialsã¨Access-Control-Allow-Originã¬ã¹ãã³ã¹ãããã¼ãè¨å®ããªããã°ãªãã¾ããããµã¼ãã¼ãæ£ãããããã¼ãè¨å®ããå ´åãè³æ ¼æ å ±ãå«ãã¬ã¹ãã³ã¹ãå¼ã³åºãå ã«é éããã¾ãã -
ãªã¯ã¨ã¹ããåç´ãªãªã¯ã¨ã¹ãã§ãªãå ´åããã©ã¦ã¶ã¼ã¯è³æ ¼æ å ±ãªãã®ããªãã©ã¤ããªã¯ã¨ã¹ããéä¿¡ãããµã¼ãã¼ã¯
Access-Control-Allow-Credentialsã¨Access-Control-Allow-Originã¬ã¹ãã³ã¹ãããã¼ãè¨å®ããªããã°ããã©ã¦ã¶ã¼ã¯å¼ã³åºãå ã«ãããã¯ã¼ã¯ã¨ã©ã¼ãè¿ãã¾ãããµã¼ãã¼ãæ£ãããããã¼ãè¨å®ããå ´åããã©ã¦ã¶ã¼ã¯è³æ ¼æ å ±ãå«ãæ¬å½ã®ãªã¯ã¨ã¹ãã«ç¶ããè³æ ¼æ å ±ãå«ãæ¬å½ã®ã¬ã¹ãã³ã¹ãå¼ã³åºãå ã«éãã¾ãã
Request ãªãã¸ã§ã¯ãã®ä½æ
Request() ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ fetch() èªä½ã¨åã弿°ãåãã¾ããããã¯ããªãã·ã§ã³ã fetch() ã«æ¸¡ã代ããã«ãåããªãã·ã§ã³ã Request() ã³ã³ã¹ãã©ã¯ã¿ã¼ã«æ¸¡ãã¦ããã®ãªãã¸ã§ã¯ãã fetch() ã«æ¸¡ããã¨ãã§ããã¨ãããã¨ã§ãã
ä¾ãã°ã次ã®ãããªã³ã¼ããç¨ã㦠fetch() ã«ãªãã·ã§ã³ã渡ããã¨ã§ POST ãªã¯ã¨ã¹ããè¡ããã¨ãã§ãã¾ãã
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const response = await fetch("https://example.org/post", {
method: "POST",
body: JSON.stringify({ username: "example" }),
headers: myHeaders,
});
ããããåã弿°ã Request() ã³ã³ã¹ãã©ã¯ã¿ã¼ã«æ¸¡ãããã«æ¸ãæãããã¨ãã§ãã¾ãã
const myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");
const myRequest = new Request("https://example.org/post", {
method: "POST",
body: JSON.stringify({ username: "example" }),
headers: myHeaders,
});
const response = await fetch(myRequest);
ããã¯ã2 ã¤ç®ã®å¼æ°ã使ç¨ãã¦ããããã£ã®ä¸é¨ã夿´ããªããã å¥ã®ãªã¯ã¨ã¹ããããªã¯ã¨ã¹ãã使ãããã¨ãã§ããã¨ãããã¨ã§ãããã¾ãã
async function post(request) {
try {
const response = await fetch(request);
const result = await response.json();
console.log("æå:", result);
} catch (error) {
console.error("ã¨ã©ã¼:", error);
}
}
const request1 = new Request("https://example.org/post", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username: "example1" }),
});
const request2 = new Request(request1, {
body: JSON.stringify({ username: "example2" }),
});
post(request1);
post(request2);
ãªã¯ã¨ã¹ãã®ä¸æ¢
ãªã¯ã¨ã¹ãã䏿¢ã§ããããã«ããã«ã¯ãAbortController ã使ããAbortSignal ããªã¯ã¨ã¹ãã® signal ããããã£ã«å²ãå½ã¦ã¾ãã
ãªã¯ã¨ã¹ãã䏿¢ããã«ã¯ãã³ã³ããã¼ã©ã¼ã® abort() ã¡ã½ãããå¼ã³åºãã¾ããfetch() ãå¼ã³åºãã¨ãä¾å¤ AbortError ãçºçãã¦ãããã¹ãæå¦ããã¾ãã
const controller = new AbortController();
const fetchButton = document.querySelector("#fetch");
fetchButton.addEventListener("click", async () => {
try {
console.log("ãã§ãããéå§");
const response = await fetch("https://example.org/get", {
signal: controller.signal,
});
console.log(`ã¬ã¹ãã³ã¹: ${response.status}`);
} catch (e) {
console.error(`ã¨ã©ã¼: ${e}`);
}
});
const cancelButton = document.querySelector("#cancel");
cancelButton.addEventListener("click", () => {
controller.abort();
console.log("ãã§ããã䏿¢");
});
fetch() ãå±¥è¡ãããå¾ã§ãã¬ã¹ãã³ã¹æ¬ä½ãèªã¿è¾¼ãåã«ãªã¯ã¨ã¹ãã䏿¢ãããå ´åãã¬ã¹ãã³ã¹æ¬ä½ãèªã¿è¾¼ããã¨ãã㨠AbortError ä¾å¤ãçºçãã¦æå¦ããã¾ãã
async function get() {
const controller = new AbortController();
const request = new Request("https://example.org/get", {
signal: controller.signal,
});
const response = await fetch(request);
controller.abort();
// 次ã®è¡ã§ã¯ `AbortError` ãçºç
const text = await response.text();
console.log(text);
}
ã¬ã¹ãã³ã¹ã®å¦ç
ãã©ã¦ã¶ã¼ããµã¼ãã¼ããã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹ã¨ãããã¼ãåãåãã¨ããã«ï¼æ½å¨çã«ã¯ã¬ã¹ãã³ã¹æ¬ä½ãåãåãåã«ï¼ãfetch() ãè¿ããããã¹ã¯ Response ãªãã¸ã§ã¯ãã§å±¥è¡ããã¾ãã
ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹ã®ãã§ãã¯
fetch() ãè¿ããããã¹ã¯ããããã¯ã¼ã¯ã¨ã©ã¼ã䏿£ãªã¹ãã¼ã ãªã©ã®ã¨ã©ã¼ã§ã¯æå¦ããã¾ãããããããµã¼ãã¼ã 404 ã®ãããªã¨ã©ã¼ã§å¿çããå ´åã fetch() 㯠Response ã§å±¥è¡ãããã®ã§ãã¬ã¹ãã³ã¹æ¬ä½ãèªã¿è¾¼ãåã«ã¹ãã¼ã¿ã¹ã調ã¹ãå¿
è¦ãããã¾ãã
Response.status ããããã£ã¯ã¹ãã¼ã¿ã¹ã³ã¼ããæ°å¤ã§æç¤ºããResponse.ok ããããã£ã¯ã¹ãã¼ã¿ã¹ã 200 çªå°ã®å ´å㯠true ãè¿ãã¾ãã
ãããããã¿ã¼ã³ã¯ãok ã®å¤ã調ã¹ã¦ false ãªãä¾å¤ãçºçããããã¨ã§ãã
async function getData() {
const url = "https://example.org/products.json";
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response.status}`);
}
// â¦
} catch (error) {
console.error(error.message);
}
}
ã¬ã¹ãã³ã¹åã®ãã§ãã¯
ã¬ã¹ãã³ã¹ã«ã¯ type ããããã£ãããã以ä¸ã®ããããã«ãªãã¾ãã
basic: ãªã¯ã¨ã¹ããåä¸ãªãªã¸ã³ãªã¯ã¨ã¹ãã ã£ããcors: ãªã¯ã¨ã¹ãããªãªã¸ã³éã® CORS ãªã¯ã¨ã¹ãã ã£ããopaque: ãªã¯ã¨ã¹ãã¯no-corsã¢ã¼ãã§è¡ãããåç´ãªãªãªã¸ã³éãªã¯ã¨ã¹ãã ã£ããopaqueredirect: ãªã¯ã¨ã¹ãã§redirectãªãã·ã§ã³ãmanualã«è¨å®ããã¦ããããµã¼ãã¼ããªãã¤ã¬ã¯ãã¹ãã¼ã¿ã¹ãè¿ããã
åã¯ã¬ã¹ãã³ã¹ã«å ¥ãããå 容ãã以ä¸ã®ããã«æ±ºå®ãã¾ãã
-
åºæ¬ã¬ã¹ãã³ã¹ã¯ç¦æ¢ã¬ã¹ãã³ã¹ãããã¼åãªã¹ãã«ããã¬ã¹ãã³ã¹ãããã¼ãé¤å¤ãã¾ãã
-
CORS ã¬ã¹ãã³ã¹ã¯ CORS ã»ã¼ããªã¹ãã¬ã¹ãã³ã¹ãããã¼ãªã¹ãã®ã¬ã¹ãã³ã¹ãããã¼ã®ã¿ãå«ã¿ã¾ãã
-
ä¸éæãªã¬ã¹ãã³ã¹ã¨ä¸éæãªãªãã¤ã¬ã¯ãã¬ã¹ãã³ã¹ã¯
statusã0ããããã¼ãªã¹ãã空ãããã¦æ¬ä½ãnullã«ãªãã¾ãã
ãããã¼ã®ãã§ãã¯
ãªã¯ã¨ã¹ãã¨åãããã«ãã¬ã¹ãã³ã¹ã«ã headers ãªãã¸ã§ã¯ãã§ãã Headers ããããã£ãããã ã¬ã¹ãã³ã¹åã«åºã¥ãé¤å¤ã«å¾ã£ã¦ãã¹ã¯ãªããã«å
¬éãããã¬ã¹ãã³ã¹ãããã¼ãæ ¼ç´ããã¾ãã
ãã®ä¸è¬çãªç¨éã¯ãæ¬ä½ãèªããã¨ããåã«ã³ã³ãã³ãåã調ã¹ããã¨ã§ãã
async function fetchJSON(request) {
try {
const response = await fetch(request);
const contentType = response.headers.get("content-type");
if (!contentType || !contentType.includes("application/json")) {
throw new TypeError("æ®å¿µãåä¿¡ããã®ã¯ JSON ã§ã¯ãªãã£ãï¼");
}
// ãã以å¤ã®å ´åãæ¬ä½ã JSON ã¨ãã¦èªã¿åãã
} catch (error) {
console.error("ã¨ã©ã¼:", error);
}
}
ã¬ã¹ãã³ã¹æ¬ä½ã®èªã¿åã
Response ã¤ã³ã¿ã¼ãã§ã¤ã¹ã«ã¯ãæ¬ä½ã®ã³ã³ãã³ãå
¨ä½ãæ§ã
ãªå½¢å¼ã§åå¾ããããã®ã¡ã½ãããããã¾ãã
ãããã¯ãã¹ã¦éåæã¡ã½ããã§ãæ¬ä½ã®ã³ã³ãã³ãã§å±¥è¡ããã Promise ãè¿ãã¾ãã
ãã®ä¾ã§ã¯ãç»åãèªã¿åã£ã¦ Blob ã¨ãã¦èªã¿è¾¼ã¿ãããã使ç¨ãã¦ãªãã¸ã§ã¯ã URL ã使ãããã¨ãã§ãã¾ãã
const image = document.querySelector("img");
const url = "flowers.jpg";
async function setImage() {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response.status}`);
}
const blob = await response.blob();
const objectURL = URL.createObjectURL(blob);
image.src = objectURL;
} catch (e) {
console.error(e);
}
}
ãã®ã¡ã½ããã§ã¯ãã¬ã¹ãã³ã¹æ¬ä½ãé©åãªå½¢å¼ã§ãªãå ´åã«ä¾å¤ãçºçãã¾ããä¾ãã°ãJSONã¨ãã¦è§£éã§ããªãã¬ã¹ãã³ã¹ã«å¯¾ã㦠json() ãå¼ã³åºããå ´åãªã©ã§ãã
ã¬ã¹ãã³ã¹æ¬ä½ã®ã¹ããªã¼ãã³ã°
ãªã¯ã¨ã¹ãæ¬ä½ã¨ã¬ã¹ãã³ã¹æ¬ä½ã¯ãå®éã«ã¯ ReadableStream ãªãã¸ã§ã¯ãã§ãããããããèªãã¨ãã¯å¸¸ã«ã³ã³ãã³ããã¹ããªã¼ãã³ã°ãã¦ãã¾ããããã¯ã¡ã¢ãªã¼å¹çãè¯ããªãã¾ããå¼ã³åºãå´ã json() ã®ãããªã¡ã½ããã使ç¨ãã¦ã¬ã¹ãã³ã¹ãåå¾ããåã«ã ãã©ã¦ã¶ã¼ãã¬ã¹ãã³ã¹å
¨ä½ãã¡ã¢ãªã¼ã«ãããã¡ãªã³ã°ããå¿
è¦ããªãããã§ãã
ã¾ããããã¯å¼ã³åºãå´ãã³ã³ãã³ããåä¿¡ããã¨ãã«å¢å ããªããå¦çã§ãããã¨ãæå³ãã¦ãã¾ãã
ä¾ãã°ã大ããªããã¹ããã¡ã¤ã«ãèªã¿åã£ã¦ããããä½ãæ¹æ³ã§å¦çããããã¦ã¼ã¶ã¼ã«è¡¨ç¤ºããããã GET ãªã¯ã¨ã¹ããèãã¦ã¿ã¾ãããã
const url = "https://www.example.org/a-large-file.txt";
async function fetchText(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response.status}`);
}
const text = await response.text();
console.log(text);
} catch (e) {
console.error(e);
}
}
ä¸è¨ã®ããã« Response.text() ã使ç¨ãããã¨ãã§ãã¾ããããã¡ã¤ã«å
¨ä½ãåä¿¡ããã¾ã§å¾
ããªããã°ãªãã¾ããã
代ããã«ã¬ã¹ãã³ã¹ãã¹ããªã¼ãã³ã°ããã¨ãæ¬ä½ããããã¯ã¼ã¯ããåä¿¡ããå¡ã®ã¾ã¾ã§å¦çãããã¨ãã§ãã¾ãã
const url = "https://www.example.org/a-large-file.txt";
async function fetchTextAsStream(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response.status}`);
}
const stream = response.body.pipeThrough(new TextDecoderStream());
for await (const value of stream) {
console.log(value);
}
} catch (e) {
console.error(e);
}
}
ãã®ä¾ã§ã¯ãiterate asynchronously ã¹ããªã¼ã ãå¦çããå°çããããããã®å¡ãå¦çãã¦ãã¾ãã
ãã®ããã«æ¬ä½ã«ç´æ¥ã¢ã¯ã»ã¹ããã¨ãã¬ã¹ãã³ã¹ã®çã®ãã¤ãåãåå¾ãããããèªåã§å¤æããªããã°ãªããªããã¨ã«æ³¨æãã¾ãããããã®å ´åãReadableStream.pipeThrough() ãå¼ã³åºã㦠TextDecoderStream ã«ã¬ã¹ãã³ã¹ãéããUTF-8 ã¨ã³ã³ã¼ããããæ¬ä½ãã¼ã¿ãããã¹ãã¨ãã¦ãã³ã¼ããã¾ãã
ããã¹ããã¡ã¤ã«ã 1 è¡ãã¤å¦çãã
ä¸è¨ã®ä¾ã§ã¯ãããã¹ããªã½ã¼ã¹ãåå¾ãããããè¡ãã¨ã«å¦çããæ£è¦è¡¨ç¾ã使ã£ã¦è¡æ«ãæ¢ãã¦ãã¾ããåãããããããã«ãããã¹ã㯠UTF-8 ãæ³å®ããèªã¿åãã¨ã©ã¼ã¯å¦çãã¾ããã
async function* makeTextFileLineIterator(fileURL) {
const response = await fetch(fileURL);
const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
let { value: chunk = "", done: readerDone } = await reader.read();
const newline = /\r?\n/g;
let startIndex = 0;
while (true) {
const result = newline.exec(chunk);
if (!result) {
if (readerDone) break;
const remainder = chunk.slice(startIndex);
({ value: chunk, done: readerDone } = await reader.read());
chunk = remainder + (chunk || "");
startIndex = newline.lastIndex = 0;
continue;
}
yield chunk.substring(startIndex, result.index);
startIndex = newline.lastIndex;
}
if (startIndex < chunk.length) {
// æå¾ã®è¡ãæ¹è¡æåã§çµãã£ã¦ããªã
yield chunk.substring(startIndex);
}
}
async function run(urlOfFile) {
for await (const line of makeTextFileLineIterator(urlOfFile)) {
processLine(line);
}
}
function processLine(line) {
console.log(line);
}
run("https://www.example.org/a-large-file.txt");
ããã¯ãã妨害ãããã¹ããªã¼ã
ãªã¯ã¨ã¹ãæ¬ä½ã¨ã¬ã¹ãã³ã¹æ¬ä½ãã¹ããªã¼ã ã§ãããã¨ã®çµæã¯ä»¥ä¸ã®ã¨ããã§ãï¼
ReadableStream.getReader()ã使ç¨ãã¦ã¹ããªã¼ã ã«ãªã¼ãã¼ãæ¥ç¶ããã¦ããå ´åããã®ã¹ããªã¼ã ã¯ããã¯ãããä»ã®èª°ãã¹ããªã¼ã ãèªããã¨ãã§ãã¾ããã- ããã¹ããªã¼ã ããä½ããã®ã³ã³ãã³ããèªã¿åãããå ´åãã¹ããªã¼ã ã¯å¦¨å®³ãããã¹ããªã¼ã ããèªã¿åããã¨ã¯ã§ãã¾ããã
ããã¯ãåãã¬ã¹ãã³ã¹ï¼ã¾ãã¯ãªã¯ã¨ã¹ãï¼æ¬ä½ãè¤æ°åèªã¿åããã¨ã¯ä¸å¯è½ã§ããã¨ãããã¨ã§ãã
async function getData() {
const url = "https://example.org/products.json";
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response.status}`);
}
const result1 = await response.json();
const result2 = await response.json(); // ä¾å¤ãçºç
} catch (error) {
console.error(error.message);
}
}
æ¬ä½ãè¤æ°åèªã¿è¾¼ãå¿
è¦ãããå ´åã¯ãæ¬ä½ãèªã¿è¾¼ãåã« Response.clone() ãå¼ã³åºãå¿
è¦ãããã¾ãã
async function getData() {
const url = "https://example.org/products.json";
try {
const response1 = await fetch(url);
if (!response1.ok) {
throw new Error(`ã¬ã¹ãã³ã¹ã¹ãã¼ã¿ã¹: ${response1.status}`);
}
const response2 = response1.clone();
const result1 = await response1.json();
const result2 = await response2.json();
} catch (error) {
console.error(error.message);
}
}
ããã¯ãµã¼ãã¹ã¯ã¼ã«ã¼ã®ãªãã©ã¤ã³ãã£ãã·ã¥å®è£ ã§ãããããã¿ã¼ã³ã§ãããµã¼ãã¹ã¯ã¼ã«ã¼ã¯ã¢ããªã«ã¬ã¹ãã³ã¹ãè¿ãã¾ãããåæã«ã¬ã¹ãã³ã¹ããã£ãã·ã¥ãããã¨ãæãã§ãã¾ãããã®ãããã¬ã¹ãã³ã¹ãè¤è£½ãã¦å ãè¿ããè¤è£½ããã£ãã·ã¥ãã¾ãã
async function cacheFirst(request) {
const cachedResponse = await caches.match(request);
if (cachedResponse) {
return cachedResponse;
}
try {
const networkResponse = await fetch(request);
if (networkResponse.ok) {
const cache = await caches.open("MyCache_1");
cache.put(request, networkResponse.clone());
}
return networkResponse;
} catch (error) {
return Response.error();
}
}
self.addEventListener("fetch", (event) => {
if (precachedResources.includes(url.pathname)) {
event.respondWith(cacheFirst(event.request));
}
});