ìë°ì¤í¬ë¦½í¸ë¥¼ ì¬ì©íë©´ íìí ë ìë²ì ë¤í¸ìí¬ ìì²ì ë³´ë´ê³ ìë¡ì´ ì 보를 ë°ìì¤ë ì¼ì í ì ììµëë¤.
ë¤í¸ìí¬ ìì²ì ë¤ìê³¼ ê°ì ê²½ì°ì ì´ë¤ì§ëë¤.
- 주문 ì ì¡
- ì¬ì©ì ì ë³´ ì½ê¸°
- ìë²ìì ìµì ë³ê²½ë¶ ê°ì ¸ì¤ê¸°
- ë±ë±
ê·¸ë°ë° ì´ ëª¨ë ê²ë¤ì íì´ì§ ìë¡ ê³ ì¹¨ ìì´ë ê°ë¥í©ëë¤.
AJAX(Asynchronous JavaScript And XML, ë¹ë기ì JavaScriptì XML)ë¼ë ì©ì´ë¥¼ ë¤ì´ë³´ì ë¶ì´ ìì¼ì¤ ê²ëë¤. AJAXë ìë²ìì ì¶ê° ì 보를 ë¹ë기ì ì¼ë¡ ê°ì ¸ì¬ ì ìê² í´ì£¼ë í¬ê´ì ì¸ ê¸°ì ì ëíë´ë ì©ì´ë¡, ë§ë¤ì´ì§ ì§ ì¤ëëììµëë¤. AJAXì XMLì´ í¬í¨ë ì´ì ê° ë°ë¡ ì´ ë문ì´ì£ .
AJAX ì´ì¸ìë ìë²ì ë¤í¸ìí¬ ìì²ì ë³´ë´ê³ ì 보를 ë°ìì¬ ì ìë ë°©ë²ì ë¤ìí©ëë¤.
ê·¸ì¤ ì´ë² ì±í°ìì 모ëíê³ ë¤ì¬ë¤ë¥í fetch() ë©ìëì ëí´ ìê°í´ëë¦¬ë ¤ í©ëë¤. fetch()ë 구ì ë¸ë¼ì°ì ìì ì§ìíì§ ìì§ë§(í´ë¦¬íì ì°ë©´ ì¬ì© ê°ë¥) ëë¶ë¶ì 모ë ë¸ë¼ì°ì ê° ì§ìí©ëë¤.
fetch() 기본 문ë²ì ë¤ìê³¼ ê°ìµëë¤.
let promise = fetch(url, [options])
urlâ ì ê·¼íê³ ì íë URLoptionsâ ì í 매ê°ë³ì, methodë header ë±ì ì§ì í ì ìì
optionsì ì무ê²ë ëê¸°ì§ ìì¼ë©´ ìì²ì GET ë©ìëë¡ ì§íëì´ urlë¡ë¶í° ì½í
ì¸ ê° ë¤ì´ë¡ë ë©ëë¤.
fetch()를 í¸ì¶íë©´ ë¸ë¼ì°ì ë ë¤í¸ìí¬ ìì²ì ë³´ë´ê³ íë¼ë¯¸ì¤ê° ë°íë©ëë¤. ë°íëë íë¼ë¯¸ì¤ë fetch()를 í¸ì¶íë ì½ëìì ì¬ì©ë©ëë¤.
ìëµì ëê° ë ë¨ê³ë¥¼ ê±°ì³ ì§íë©ëë¤.
먼ì , ìë²ìì ìëµ í¤ë를 ë°ìë§ì fetch í¸ì¶ ì ë°íë°ì promiseê° ë´ì¥ í´ëì¤ Responseì ì¸ì¤í´ì¤ì í¨ê» ì´í ìíê° ë©ëë¤.
ì´ ë¨ê³ë ìì§ ë³¸ë¬¸(body)ì´ ëì°©í기 ì ì´ì§ë§, ê°ë°ìë ìëµ í¤ë를 ë³´ê³ ìì²ì´ ì±ê³µì ì¼ë¡ ì²ë¦¬ëìëì§ ìëì§ë¥¼ íì¸í ì ììµëë¤.
ë¤í¸ìí¬ ë¬¸ì ë ì¡´ì¬íì§ ìë ì¬ì´í¸ì ì ìíë ¤ë ê²½ì°ê°ì´ HTTP ìì²ì ë³´ë¼ ì ìë ìíìì íë¼ë¯¸ì¤ë ê±°ë¶ìíê° ë©ëë¤.
HTTP ìíë ìëµ íë¡í¼í°ë¥¼ ì¬ì©í´ íì¸í ì ììµëë¤.
statusâ HTTP ìí ì½ë(ì: 200)okâ ë¶ë¦° ê°. HTTP ìí ì½ëê° 200ê³¼ 299 ì¬ì´ì¼ ê²½ì°true
ìì:
let response = await fetch(url);
if (response.ok) { // HTTP ìí ì½ëê° 200~299ì¼ ê²½ì°
// ìëµ ëª¬ë¬¸ì ë°ìµëë¤(ê´ë ¨ ë©ìëë ìëìì ì¤ëª
).
let json = await response.json();
} else {
alert("HTTP-Error: " + response.status);
}
ë ë²ì§¸ ë¨ê³ìì ì¶ê° ë©ìë를 í¸ì¶í´ ìëµ ë³¸ë¬¸ì ë°ìµëë¤.
response ìë íë¼ë¯¸ì¤ë¥¼ 기ë°ì¼ë¡ íë ë¤ìí ë©ìëê° ììµëë¤. ì´ ë©ìëë¤ì ì¬ì©íë©´ ë¤ìí ííì ìëµ ë³¸ë¬¸ì ì²ë¦¬í ì ììµëë¤.
response.text()â ìëµì ì½ê³ í ì¤í¸ë¥¼ ë°íí©ëë¤,response.json()â ìëµì JSON ííë¡ íì±í©ëë¤,response.formData()â ìëµìFormDataê°ì²´ ííë¡ ë°íí©ëë¤.FormDataì ëí ìì¸í ë´ì©ì ë¤ì ì±í°ìì ë¤ë£¨ê² ìµëë¤.response.blob()â ìëµì Blob(íì ì´ ìë ë°ì´ë리 ë°ì´í°) ííë¡ ë°íí©ëë¤.response.arrayBuffer()â ìëµì ArrayBuffer(ë°ì´ë리 ë°ì´í°ë¥¼ ë¡ì° ë 벨 íìì¼ë¡ ííí ê²) ííë¡ ë°íí©ëë¤.- ì´ ì¸ìë
response.bodyê° ìëë°, ReadableStream ê°ì²´ì¸response.body를 ì¬ì©íë©´ ìëµ ë³¸ë¬¸ì ì²í¬ ë¨ìë¡ ì½ì ì ììµëë¤. ìì¸í ì©ë¡ë ê³§ ì´í´ë³´ê² ìµëë¤.
ì§ê¸ê¹ì§ ë°°ì´ ë´ì©ì í ëë¡ GitHubìì ë§ì§ë§ 커ë°ì JSON ê°ì²´ ííë¡ ë°ìë´ ìë¤.
let url = 'https://api.github.com/repos/javascript-tutorial/ko.javascript.info/commits';
let response = await fetch(url);
let commits = await response.json(); // ìëµ ë³¸ë¬¸ì ì½ê³ JSON ííë¡ íì±í¨
alert(commits[0].author.login);
ì ìì를 await ìì´ íë¼ë¯¸ì¤ë§ ì¬ì©íë©´ ë¤ìê³¼ ê°ì´ ë°ê¿ ì ììµëë¤.
fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits')
.then(response => response.json())
.then(commits => alert(commits[0].author.login));
ìëµì í
ì¤í¸ ííë¡ ì»ì¼ë ¤ë©´ .json() ëì await response.text()를 ì¬ì©íë©´ ë©ëë¤.
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) + '...');
ì´ë²ì fetch를 ì¬ì©í´ fetch ëª
ì¸ì ì°ì¸¡ ìë¨ì ìë ë¡ê³ (ë°ì´ë리 ë°ì´í°)를 ê°ì ¸ì ë³´ê² ìµëë¤. ì°¸ê³ ë¡ Blobì ëí ìì¸í ë´ì©ì ë§í¬ìì ì´í´ë³¼ ì ììµëë¤.
let response = await fetch('/article/fetch/logo-fetch.svg');
let blob = await response.blob(); // ìëµì 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);
본문ì ì½ì ë ì¬ì©ëë ë©ìëë ë± íëë§ ì¬ì©í ì ììµëë¤.
response.text()를 ì¬ì©í´ ìëµì ì»ìë¤ë©´ 본문ì ì½í
ì¸ ë 모ë ì²ë¦¬ ë ìíì´ê¸° ë문ì response.json()ì ëìíì§ ììµëë¤.
let text = await response.text(); // ìëµ ë³¸ë¬¸ì´ ìë¹ë©ëë¤.
let parsed = await response.json(); // ì¤í¨
ìëµ í¤ë
ìëµ í¤ëë response.headersì 맵과 ì ì¬í ííë¡ ì ì¥ë©ëë¤.
ë§µì ìëëë¤. íì§ë§ 맵과 ì ì¬í ë©ìë를 ì§ìíì£ . ì´ ë©ìëë¤ì ì¬ì©íë©´ í¤ë ì¼ë¶ë§ ì¶ì¶íê±°ë í¤ë ì 체를 ìíí ì ììµëë¤.
let response = await fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits');
// í¤ë ì¼ë¶ë¥¼ ì¶ì¶
alert(response.headers.get('Content-Type')); // application/json; charset=utf-8
// í¤ë ì 체를 ìí
for (let [key, value] of response.headers) {
alert(`${key} = ${value}`);
}
ìì² í¤ë
headers ìµì
ì ì¬ì©íë©´ fetchì ìì² í¤ë를 ì¤ì í ì ììµëë¤. headersì ìëì ê°ì´ ë¤ìí í¤ë ì ë³´ê° ë´ê¸´ ê°ì²´ë¥¼ ëê¸°ê² ë©ëë¤.
let response = fetch(protectedUrl, {
headers: {
Authentication: 'secret'
}
});
ê·¸ë°ë° headers를 ì¬ì©í´ ì¤ì í ì ìë í¤ëë ììµëë¤. ê¸ì§ë í¤ë ì ì²´ 목ë¡ì ë§í¬ìì íì¸í ì ììµëë¤.
Accept-Charset,Accept-EncodingAccess-Control-Request-HeadersAccess-Control-Request-MethodConnectionContent-LengthCookie,Cookie2DateDNTExpectHostKeep-AliveOriginRefererTETrailerTransfer-EncodingUpgradeViaProxy-*Sec-*
ì´ë° ì ì½ì HTTP를 목ì ì ë§ê³ ìì íê² ì¬ì©í ì ìëë¡ íë ¤ê³ ë§ë¤ì´ì¡ìµëë¤. ê¸ì§ 목ë¡ì ìë í¤ëë ë¸ë¼ì°ì ë§ ë°°íì ì¼ë¡ ì¤ì , ê´ë¦¬í ì ììµëë¤.
POST ìì²
GET ì´ì¸ì ìì²ì ë³´ë´ë ¤ë©´ ì¶ê° ìµì
ì ì¬ì©í´ì¼ í©ëë¤.
methodâ HTTP ë©ìë(ì:POST)bodyâ ìì² ë³¸ë¬¸ì¼ë¡ ë¤ì í목 ì¤ íëì´ì´ì¼ í©ëë¤.- 문ìì´(ì: JSON 문ìì´)
FormDataê°ì²´ âform/multipartííë¡ ë°ì´í°ë¥¼ ì ì¡í기 ìí´ ì°ì ëë¤.BlobëBufferSourceâ ë°ì´ë리 ë°ì´í° ì ì¡ì ìí´ ì°ì ëë¤.- URLSearchParams â ë°ì´í°ë¥¼
x-www-form-urlencodedííë¡ ë³´ë´ê¸° ìí´ ì°ì´ëë°, ìì¦ì ì ì¬ì©íì§ ììµëë¤.
ëë¶ë¶ì JSONì ìì² ë³¸ë¬¸ì ì¤ì´ ë³´ë´ê² ë©ëë¤.
user ê°ì²´ë¥¼ 본문ì ì¤ì´ ë³´ë´ë ìì를 ì´í´ë´
ìë¤.
let user = {
name: 'John',
surname: 'Smith'
};
let response = await fetch('/article/fetch/post/user', {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8'
},
body: JSON.stringify(user)
});
let result = await response.json();
alert(result.message);
POST ìì²ì ë³´ë¼ ë 주ìí ì ì ìì² ë³¸ë¬¸ì´ ë¬¸ìì´ì¼ ë Content-Type í¤ëê° text/plain;charset=UTF-8ë¡ ê¸°ë³¸ ì¤ì ëë¤ë ì ì
ëë¤.
íì§ë§ ì ìììì JSONì ì ì¡íê³ ì기 ë문ì headersì ì ëë¡ ë Content-Typeì¸ application/jsonì ì¤ì í´ ì£¼ììµëë¤.
ì´ë¯¸ì§ ì ì¡í기
Blobì´ë BufferSource ê°ì²´ë¥¼ ì¬ì©íë©´ fetchë¡ ë°ì´ë리 ë°ì´í°ë¥¼ ì ì¡í ì ììµëë¤.
ìì를 ì´í´ë´
ìë¤. <canvas>ì ë§ì°ì¤ë¥¼ ìì§ì¬ ì´ë¯¸ì§ë¥¼ ë§ë¤ê³ âì ì¡â ë²í¼ì ëë¬ ì´ë¯¸ì§ë¥¼ ìë²ì ì ì¡í´ë³´ê² ìµëë¤.
<body style="margin:0">
<canvas id="canvasElem" width="100" height="80" style="border:1px solid"></canvas>
<input type="button" value="ì ì¡" 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/post/image', {
method: 'POST',
body: blob
});
// ì ì¡ì´ ì ëìë¤ë ìëµì´ ì¤ê³ ì´ë¯¸ì§ ì¬ì´ì¦ê° ì¼ë¿ì°½ì ì¶ë ¥ë©ëë¤.
let result = await response.json();
alert(result.message);
}
</script>
</body>
ì´ë²ì Content-Type í¤ë를 ëª
ìì ì¼ë¡ ì¤ì íì§ ìì ì ì 주목í´ì£¼ì기 ë°ëëë¤. Blob ê°ì²´ë ë´ì¥ íì
ì ê°ê¸° ë문ì í¹ë³í Content-Type를 ì¤ì íì§ ììë ë©ëë¤. ììë ì´ë¯¸ì§ë¥¼ ì ì¡í기 ë문ì toBlobì ìí´ image/pngê° ìëì¼ë¡ ì¤ì ëììµëë¤. ì´ë ê² Blob ê°ì²´ì ê²½ì° í´ë¹ ê°ì²´ì íì
ì´ Content-Type í¤ëì ê°ì´ ë©ëë¤.
ì ììì í¨ì submit()ì async/await ìì´ ìì±íë©´ ìëì ê°ìµëë¤.
function submit() {
canvasElem.toBlob(function(blob) {
fetch('/article/fetch/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); // ìëµ í¤ëì í¨ê» ì´íë¨
let result = await response.json(); // json 본문ì ì½ì
ë¬¼ë¡ await ìì´ë ìì²ì ë³´ë¼ ì ììµëë¤.
fetch(url, options)
.then(response => response.json())
.then(result => /* ê²°ê³¼ ì²ë¦¬ */)
ìëµ ê°ì²´ì íë¡í¼í°ë ë¤ìê³¼ ê°ìµëë¤.
response.statusâ ìëµì HTTP ì½ëresponse.okâ ìëµ ìíê° 200ê³¼ 299 ì¬ì´ì ìë ê²½ì°trueresponse.headersâ 맵과 ì ì¬í ííì HTTP í¤ë
ìëµ ë³¸ë¬¸ì ì»ì¼ë ¤ë©´ ë¤ìê³¼ ê°ì ë©ìë를 ì¬ì©íë©´ ë©ëë¤.
response.text()â ìëµì í ì¤í¸ ííë¡ ë°íí¨response.json()â ìëµì íì±í´ JSON ê°ì²´ë¡ ë³ê²½í¨response.formData()â ìëµìFormDataê°ì²´ ííë¡ ë°í(form/multipart ì¸ì½ë©ì ëí ë´ì©ì ë¤ì ì±í°ìì ë¤ë£¸)response.blob()â ìëµì Blob(íì ì´ ìë ë°ì´ë리 ë°ì´í°) ííë¡ ë°íresponse.arrayBuffer()â ìëµì ArrayBuffer(ë°ì´ë리 ë°ì´í°ë¥¼ ë¡ì° ë ë²¨ë¡ ííí ê²) ííë¡ ë°í
ì§ê¸ê¹ì§ ë°°ì´ fetch ìµì
ì ë¤ìê³¼ ê°ìµëë¤.
methodâ HTTP ë©ìëheadersâ ìì² í¤ëê° ë´ê¸´ ê°ì²´(ì ì½ ì¬íì´ ìì)bodyâ ë³´ë´ë ¤ë ë°ì´í°(ìì² ë³¸ë¬¸)ë¡stringì´ëFormData,BufferSource,Blob,UrlSearchParamsê°ì²´ íí
ì´ì´ì§ë ì±í°ìì ì´ ì¸ì ìµì
ê³¼ ë¤ìí fetch ì ì¤ ì¼ì´ì¤ë¥¼ ì´í´ë³´ê² ìµëë¤.
ëê¸
<code>í그를, ì¬ë¬ ì¤ë¡ 구ì±ë ì½ë를 ì½ì íê³ ì¶ë¤ë©´<pre>í그를 ì´ì©íì¸ì. 10ì¤ ì´ìì ì½ëë plnkr, JSBin, codepen ë±ì ìëë°ì¤ë¥¼ ì¬ì©íì¸ì.