JavaScript ã¯ãå¿ è¦ã«å¿ãã¦ãã¤ã§ããµã¼ãã¸ãªã¯ã¨ã¹ããéä¿¡ããæ°ããæ å ±ãèªã¿è¾¼ããã¨ãã§ãã¾ãã
ä¾ãã°ã次ã®ãããªãã¨ãã§ãã¾ã:
- 注æãéä¿¡ãã
- ã¦ã¼ã¶æ å ±ãèªã¿è¾¼ã
- ãµã¼ãããææ°ã®æ´æ°æ å ±ãåãåã
- â¦ãªã©
â¦ããã¦ãããã¯ãã¹ã¦ãã¼ã¸ããªãã¼ããããã¨ãªãè¡ããã¨ãã§ãã¾ãã
ããã表ãå æ¬çãªç¨èª âAJAXâ (Asynchronous Javascript And Xml)ãããã¾ããXML ã使ãå¿ è¦ã¯ããã¾ãã: ãã®ç¨èªã¯æããæ¥ã¦ãã¾ãã
ãããã¯ã¼ã¯ãªã¯ã¨ã¹ããéä¿¡ãããµã¼ãããæ å ±ãåå¾ããããã®æ§ã ãªæ¹æ³ãããã¾ãã
fetch() ã¡ã½ããã¯ã¢ãã³ã§å¤ç®çã«å©ç¨ã§ãããããããããå§ãã¾ããããfetch ã¯æ°å¹´éé²åã¨æ¹åãç¶ãã¦ãã¾ããä»ã®ã¨ãããµãã¼ãã¯ãã©ã¦ã¶ã®éã§ã¨ã¦ããã£ãããã¦ãã¾ãã
åºæ¬æ§æã¯æ¬¡ã®éãã§ã:
let promise = fetch(url, [options])
urlâ ã¢ã¯ã»ã¹ãã URLoptionsâ ãªãã·ã§ã³ã®ãã©ã¡ã¼ã¿: ã¡ã½ãããããããªã©
ãã©ã¦ã¶ã¯ããã«ãªã¯ã¨ã¹ããéå§ããpromise ãè¿ãã¾ãã
ã¬ã¹ãã³ã¹ã®åå¾ã¯é常2段éã®ããã»ã¹ã«ãªãã¾ãã
promise ã¯ããµã¼ããããããå¿çããã¨ããã«çµã¿è¾¼ã¿ã® Response ã¯ã©ã¹ã®ãªãã¸ã§ã¯ãã§ resolve ãã¾ãã
ãã®ãããHTTP ã¹ãã¼ã¿ã¹ããã§ãã¯ãããã¨ã§ããªã¯ã¨ã¹ããæåããã®ã失æããã®ãã確èªãããããããããã§ãã¯ãããã¨ãã§ãã¾ããããã¾ã æ¬æã¯æã£ã¦ãã¾ããã
promise 㯠fetch ã HTTP ãªã¯ã¨ã¹ããä½ããããã¨ãã§ããªãã£ãå ´åãä¾ãã° ãããã¯ã¼ã¯ã®åé¡ããã®ãããªãµã¤ãããªãå ´åã« reject ãã¾ãã404 ã 500 ã®ãã㪠HTTP ã¨ã©ã¼ãé常ã®ããã¼ã¨ã¿ãªããã¾ãã
ã¬ã¹ãã³ã¹ã®ããããã£ã§ãããã確èªãããã¨ãã§ãã¾ãã:
okâ boolean, HTTP ã¹ãã¼ã¿ã¹ã³ã¼ãã 200-299 ã®å ´åtrueã§ããstatusâ HTTP ã¹ãã¼ã¿ã¹ã³ã¼ã.
ä¾:
let response = await fetch(url);
if (response.ok) { // HTTP ã¹ãã¼ã¿ã¹ã 200-299 ã®å ´å
// ã¬ã¹ãã³ã¹ã®æ¬æãåå¾(å¾è¿°)
let json = await response.json();
} else {
alert("HTTP-Error: " + response.status);
}
ã¬ã¹ãã³ã¹ã®æ¬æãåå¾ããã«ã¯ã追å ã®ã¡ã½ããå¼ã³åºããå¿ è¦ã§ãã
Response ã¯æ§ã
ãªå½¢å¼ã§æ¬æã«ã¢ã¯ã»ã¹ããããã®ãè¤æ°ã® promise ãã¼ã¹ã®ã¡ã½ãããæä¾ãã¦ãã¾ãã:
response.json()â ã¬ã¹ãã³ã¹ã JSON ãªãã¸ã§ã¯ãã¨ãã¦ãã¼ã¹ãã¾ãresponse.text()â ã¬ã¹ãã³ã¹ãããã¹ãã¨ãã¦è¿ãã¾ãresponse.formData()â FormData ãªãã¸ã§ã¯ã(form/multipart encoding) ã¨ãã¦è¿ãã¾ã,response.blob()â Blob (åä»ãã®ãã¤ããªãã¼ã¿) ã¨ãã¦ã¬ã¹ãã³ã¹ãè¿ãã¾ã,response.arrayBuffer()â ArrayBuffer (ç´ç²ãªãã¤ããªãã¼ã¿) ã¨ãã¦ã¬ã¹ãã³ã¹ãè¿ãã¾ã,- å ãã¦,
response.body㯠ReadableStream ãªãã¸ã§ã¯ãã§ãæ¬æããã£ã³ã¯æ¯ã«èªããã¨ãã§ãã¾ããå¾ã»ã©ä¾ãè¦ã¦ããã¾ãããã
ä¾ãã°ãããã§ã¯ Github ããææ°ã®ã³ãããã® JSON ãªãã¸ã§ã¯ããåå¾ãã¾ãã:
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
let commits = await response.json(); // ã¬ã¹ãã³ã¹ã®æ¬æãèªã¿ JSON ã¨ãã¦ãã¼ã¹ãã
alert(commits[0].author.login);
ãããã¯ãç´ç²ãª promise æ§æã使ç¨ããå ´åã¯æ¬¡ã®ããã«ãªãã¾ã:
fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
.then(response => response.json())
.then(commits => alert(commits[0].author.login));
ããã¹ããåå¾ããã«ã¯:
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
let text = await response.text(); // ã¬ã¹ãã³ã¹ããã£ãããã¹ãã¨ãã¦èªã
alert(text.slice(0, 80) + '...');
ã¾ãããã¤ããªã®ä¾ã§ã¯ãç»åãåå¾ãã¦è¡¨ç¤ºãã¦ã¿ã¾ããã(blob ã«å¯¾ããæä½ã®è©³ç´°ã«ã¤ãã¦ã¯ããã£ãã¿ã¼ Blob ãåç §ãã¦ãã ãã)ã:
let response = await fetch('/article/fetch/logo-fetch.svg');
let blob = await response.blob(); // Blob ãªãã¸ã§ã¯ãã¨ãã¦ãã¦ã³ãã¼ã
// <img> ã使
let img = document.createElement('img');
img.style = 'position:fixed;top:10px;left:10px;width:100px';
document.body.append(img);
// 表示
img.src = URL.createObjectURL(blob);
setTimeout(() => { // 3ç§å¾ã«é ã
img.remove();
URL.revokeObjectURL(img.src);
}, 3000);
æ¬æã®ãã¼ã¹æ¹æ³ã¯1ã¤ã ãé¸ã¶ãã¨ãã§ãã¾ãã
ãã response.text() ã§ã¬ã¹ãã³ã¹ãåå¾ããå¾ãresponse.json() ã¯åä½ãã¾ãããæ¬æã®ã³ã³ãã³ãã¯æ¢ã«å¦çããã¦ããããã§ãã
let text = await response.text(); // æ¬æãè¿ã
let parsed = await response.json(); // 失æ (æ¢ã«æ¬æã¯å¦çæ¸ã¿)
Headers
response.headers ã«ã¯ãMapã©ã¤ã¯ãªããããªãã¸ã§ã¯ããããã¾ãã
åã ã®ããããåå¾ããããããããã¤ãã¬ã¼ããããã¨ãã§ãã¾ãã
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
// ãããã1ã¤åå¾
alert(response.headers.get('Content-Type')); // application/json; charset=utf-8
// ãã¹ã¦ã®ããããã¤ãã¬ã¼ã
for (let [key, value] of response.headers) {
alert(`${key} = ${value}`);
}
ããããè¨å®ããã«ã¯ã次ã®ããã« headers ãªãã·ã§ã³ã使ç¨ãã¾ã:
let response = fetch(protectedUrl, {
headers: {
Authentication: 'abcdef'
}
});
â¦ããããè¨å®ã§ããªã ç¦æ¢ããã HTTP ããã ã®ãªã¹ããããã¾ãã:
Accept-Charset,Accept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodConnectionContent-LengthCookie,Cookie2DateDNTExpectHostKeep-AliveOriginRefererTETrailerTransfer-EncodingUpgradeViaProxy-*Sec-*
ãããã®ãããã¯é©åã§å®å ¨ãª HTTP ãä¿è¨¼ããããããã©ã¦ã¶ã«ãã£ã¦ã®ã¿å¶å¾¡ããã¾ãã
POST ãªã¯ã¨ã¹ã
POSTããããã¯ä»ã®ã¡ã½ããã使ã£ããªã¯ã¨ã¹ããè¡ãã«ã¯ãfetch ã®ãªãã·ã§ã³ãå©ç¨ãã¾ã:
methodâ HTTP ã¡ã½ãã, e.g.POST,bodyâ æ¬¡ã®ãããã:- æåå (e.g. JSON),
FormDataãªãã¸ã§ã¯ã,form/multipartã¨ãã¦ãã¼ã¿ãéä¿¡ããå ´å,Blob/BufferSourceãã¤ããªãã¼ã¿ãéä¿¡ããå ´å,- URLSearchParams,
x-www-form-urlencodedã¨ãã¦ãã¼ã¿ãéä¿¡ããå ´åãã»ã¨ãã©ä½¿ããã¾ããã
ä¾ãè¦ã¦ã¿ã¾ãããããã®ã³ã¼ãã¯ãuser ãªãã¸ã§ã¯ãã JSON ã¨ãã¦éä¿¡ãã¾ãã:
let user = {
name: 'John',
surname: 'Smith'
};
let response = await fetch('/article/fetch-basics/post/user', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(user)
});
let result = await response.json();
alert(result.message);
æ¬æ(body)ãæååã®å ´åãContent-Type ã«ã¯ããã©ã«ãã§ã¯ text/plain ãè¨å®ããããã¨ã«çæãã¦ãã ããããã®ãããapplication/json ã代ããã«éä¿¡ããããã« headers ãªãã·ã§ã³ã使ç¨ãã¦ãã¾ãã
ç»åãéä¿¡ãã
Blob ã BufferSource ã使ç¨ãã¦ããã¤ããªãã¼ã¿ãç´æ¥éä¿¡ãããã¨ãã§ãã¾ãã
ä¾ãã°ãããã«ãã¦ã¹ãåãããã¨ã§æç»ãã§ãã <canvas> ãããã¾ããâsubmitâ ãã¿ã³ãã¯ãªãã¯ããã¨ãç»åããµã¼ãã«éä¿¡ãã¾ãã:
<body style="margin:0">
<canvas id="canvasElem" width="100" height="80" style="border:1px solid"></canvas>
<input type="button" value="Submit" onclick="submit()">
<script>
canvasElem.onmousemove = function(e) {
let ctx = canvasElem.getContext('2d');
ctx.lineTo(e.clientX, e.clientY);
ctx.stroke();
};
async function submit() {
let blob = await new Promise(resolve => canvasElem.toBlob(resolve, 'image/png'));
let response = await fetch('/article/fetch-basics/post/image', {
method: 'POST',
body: blob
});
let result = await response.json();
alert(result.message);
}
</script>
</body>
ããã§ã Content-Type ãæåã§è¨å®ããå¿
è¦ãããã¾ããã§ããããªããªããBlob ãªãã¸ã§ã¯ãã¯çµã¿è¾¼ã¿ã®ã¿ã¤ã(toBlob ã«ããçæããã image/png)ãæã£ã¦ããããã§ãã
submit() 颿°ã¯ãã®ããã« async/await ãªãã§æ¸ããã¨ãã§ãã¾ãã:
function submit() {
canvasElem.toBlob(function(blob) {
fetch('/article/fetch-basics/post/image', {
method: 'POST',
body: blob
})
.then(response => response.json())
.then(result => alert(JSON.stringify(result, null, 2)))
}, 'image/png');
}
ãµããª
å
¸åç㪠fetch ãªã¯ã¨ã¹ãã¯ï¼ã¤ã® await ããæãã¾ã:
let response = await fetch(url, options); // ã¬ã¹ãã³ã¹ãããã§ resolve ãã
let result = await response.json(); // æ¬æã json ã¨ãã¦èªã
ãããã¯ãpromise ã使ã£ãæ¸ãæ¹:
fetch(url, options)
.then(response => response.json())
.then(result => /* result ãå¦çãã */)
ã¬ã¹ãã³ã¹ã®ããããã£:
response.statusâ ã¬ã¹ãã³ã¹ã® HTTP ã³ã¼ã,response.okâ ã¹ãã¼ã¿ã¹ã 200-299 ã®å ´åtrueresponse.headersâ HTTP ããããæã¤ Mapã©ã¤ã¯ãªãªãã¸ã§ã¯ã
ã¬ã¹ãã³ã¹æ¬æãåå¾ããã¡ã½ãã:
response.json()â ã¬ã¹ãã³ã¹ã JSON ãªãã¸ã§ã¯ãã¨ãã¦ãã¼ã¹ãã,response.text()â ã¬ã¹ãã³ã¹ãããã¹ãã¨ãã¦è¿ã,response.formData()â FormData ãªãã¸ã§ã¯ã(form/multipart encoding) ã¨ãã¦è¿ã,response.blob()â Blob (åä»ãã®ãã¤ããªãã¼ã¿) ã¨ãã¦ã¬ã¹ãã³ã¹ãè¿ã,response.arrayBuffer()â ArrayBuffer (ç´ç²ãªãã¤ããªãã¼ã¿) ã¨ãã¦ã¬ã¹ãã³ã¹ãè¿ã,
ããã¾ã§ã®ã¨ãããfetch ãªãã·ã§ã³ã¯æ¬¡ã®éãã§ã:
methodâ HTTP ã¡ã½ãã,headersâ ãªã¯ã¨ã¹ãããããæã¤ãªãã¸ã§ã¯ã(ã©ããªãããã許å¯ãããããã§ã¯ããã¾ãã),bodyâ ãµãããããã string/FormData/BufferSource/Blob/UrlSearchParams ãã¼ã¿ã
次ã®ãã£ãã¿ã¼ã§ã¯ãããå¤ãã®ãªãã·ã§ã³ã¨ã¦ã¼ã¹ã±ã¼ã¹ãè¦ã¦ããã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã