๐ ํด๋ผ์ด์ธํธ ๋จ์ API ํธ์ถ์ ๋์์ฃผ๋ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โ request
โ axios
โ jQuery
๐ ํด๋ผ์ด์ธํธ ๋จ์ API ํธ์ถ์ ๋์์ฃผ๋ ๋ธ๋ผ์ฐ์ ๋ด์ฅ ๊ฐ์ฒด or ํจ์
โ XMLHttpRequest - ๊ฐ์ฒด
โ fetch( ) - ํจ์
๐ XMLHttpRequest ํน์ง
โพ XML๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์ ์๋ค.
โพ ์ค๋๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ง์ํ๊ธฐ ์ํด ์์ง๊น์ง๋ ์ด๋ค.
โพ fetch๊ฐ ์์ง ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ์ผ๋ค์ ์ํด ์ฐ์ธ๋ค. ( ex. ์ ๋ก๋ ์งํ ์ํฉ ์ถ์ ํ๊ธฐ )
โพ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐ์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์๋ ์๊ณ , ๋น๋๊ธฐ์ ์ผ๋ก ๋ถ๋ฌ์ฌ ์๋ ์๋ค.
๐ XMLHttpRequest ์ฌ์ฉ๋ฒ
๐ ๋ฌธ๋ฒ
// request๋ฅผ ์์ฒญํ๊ธฐ ์ํด์๋ 3๊ฐ์ง ๋จ๊ณ๊ฐ ํ์ํ๋ค.
// 01 XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. (์์ฑ๊ณผ ํจ๊ป ๋ชจ๋ ์์ฒญ์ ์ด๊ธฐํ๋๋ค.)
// 02 request ์์ฒญ์ ํ์ํ ์ต์
์ ์ ์ํด์ค๋ค.
// 03 request ์์ฒญ์ ๋ณด๋ธ๋ค.
// 01
let xhr = new XMLHttpRequest();
// 02
xhr.open(method, URL, [options]); // options์์ asunc, uer, password ๋ฑ ์ค์ ๊ฐ๋ฅ
โ Asynchronous
// xhr.open(method, URL, true) ์ต์
์ ์ถ๊ฐ๋ก ์ค๋ค.
โ Synchronous
// (default๊ฐ์ผ๋ก ์ค์ ๋์์)
// xhr.open(method, URL, false) ์ต์
์ ์ถ๊ฐ๋ก ์ฃผ๊ฑฐ๋ ์์ ์ด์ฃผ๋ฉด ๋๋ค.
// 03
xhr.send([body]);
// XMLHttpRequest ๋ฉ์๋๋ ์๋ต์ xhr event handler ๋ก ์ฒ๋ฆฌํ๋ค.
// load : ์๋ต์ด ์๋ฒฝํ ๋ฐ์์ ธ์์ ๋ (์ฑ๊ณต/์คํจ ์๊ด์์ด ์ฒ๋ฆฌ)
// error : ์๋ต์ด ์๋ฃ๋์ง ์์์ ๋ (๋คํธ์ํฌ๊ฐ ๋ค์ด๋์๊ฑฐ๋ URL์ด ๋ช
ํํ์ง ์๋ ๊ฒฝ์ฐ ์ฒ๋ฆฌ)
// progress : ์๋ต์ด download๋ ๋์ ์ํฉ์ ์ฃผ๊ธฐ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐํด์ผํ ๋
xhr.onload = function(){
console.log('Loaded', `${xhr.status} ${xhr.response}`);
};
xhr.onerror = function(){
console.log('Error');
};
xhr.onprogress = function(event){
console.log(`Received ${event.loaded} of ${event.total}`);
// event.loaded : ๋ค์ด๋ก๋ํ ๋ฐ์ดํธ ์ ํ์ธ ๊ฐ๋ฅ
// event.total : ์ด ๋ฐ์ดํธ ์ ํ์ธ ๊ฐ๋ฅ
// event.lengthComputable = true ์ด๋ฉด ์๋ฒ์์ Content-Length ํค๋๋ฅผ ๋ณด๋ด์ค๋ค.
};
๐ ์์
let xhr = new XMLHttpRequest();
xhr.open('GET', 'https://code-designer.tistory.com/manage/newpost/');
xhr.send();
xhr.onload = function(){
if(zhr.status === 200){
console.log('Success', `${xhr.response}`);
}
else{
console.log('Error', `${xhr.status} ${xhr.statusText}`);
}
// xhr ํ๋กํผํฐ๋ค
// xhr.status : HTTP ์ํ ์ฝ๋
// xhr.statusText : HTTP ์ํ ๋ฉ์ธ์ง
// xhr.response(xhr.responseText) : ์๋ต๋ body
};
xhr.onerror = function(){
console.log('Error');
};
// xhr.onprogress = function(event){
// if(event.lengthComputable){
// console.log(`Received ${event.loaded} of ${event.total} bytes`);
// }
// ์๋ต์ Content-Length ํค๋๊ฐ ์์ ๋
// else{
// console.log(`Reveived ${event.loaded} bytes`);
// }
// }
๐ Fetch API ํน์ง
โพ Fetch API๋ ์ธ์ ๋ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
โพ HTTP error ์ผ๋ reject๋ฅผ ๋ฐํํ์ง ์๊ณ , ๋์ ok ์ํ๊ฐ false์ธ resolve๋ฅผ ๋ฐํํ๋ค.
--> Promise์ ํน์ฑ๊ณผ ์์ ํ ์ผ์นํ์ง ์๋๋ค๋ ๊ฑธ ์ ์ ์์
--> BUT ๋คํธ์ํฌ ์ฅ์ ๋ ์์ฒญ ์์ฒด๊ฐ ์๋ฃ๋์ง ๋ชปํ๋ฉด reject๋ฅผ ๋ฐํํ๋ค.
โพ Fetch API๋ ์ฟ ํค๋ ์ฃผ๊ณ ๋ฐ์ง ์๋๋ค. ์ฟ ํค๋ฅผ ์ ์กํ๊ณ ์ถ์ผ๋ฉด credential ์ต์ ์ ๋ฐ๋์ ์ค์ ํด์ผ ํ๋ค.
๐ Fetch API ์ฌ์ฉ๋ฒ
๐ ๋ฌธ๋ฒ
// fetch()
// ์ฒซ๋ฒ์งธ ์ธ์๋ก URL, ๋๋ฒ์งธ ์ธ์๋ก ์ต์
๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ค.
fetch(url, [options])
.then((response) => console.log(response))
.catch((error) => console.log(error));
๐ ์์ 1
fetch('https://code-designer.tistory.com/manage/newpost/')
.then((response) => console.log(response));
// Response
// {type: 'basic', redirected: false, status: 200, ok: true,
// url: 'https://code-designer.tistory.com/manage/newpost/'…}
๐ ์์ 2
// ์ด๋ ๊ฒ ์ต์
์ ๋ฉ์๋์ ํค๋, ๋ฐ๋๊น์ง ์ ์ํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด fetch ์์ฒญ์ ํ ์ ์๋ค.
// ์ต์
๊ฐ์ฒด๊ฐ ์์ผ๋ฉด default๋ก GET ์์ฒญ์ด ๋๋ค.
let url = 'https://code-designer.tistory.com/manage/newpost/';
let data = { id: 1 };
fetch(url, {
method: 'POST' // ๋๋ 'PUT'
headers: {
'Content-Type': 'application/json'
}
body: JSON.stringify(data), // data๋ ๋ฌธ์๊ฑฐ๋ ๊ฐ์ฒด ๊ฐ๋ฅ.
}).then(res => res.json())
.then(data => console.log('Success', data))
.catch(error => console.log('Error', error));
'Front-end > Browser' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ง์ ์๋ฒ๋ฅผ ๋ง๋ค๋ฉด์ ๋ฐฐ์ด Location Header (0) | 2021.10.26 |
---|---|
Simple Request : HTTP Message ๋ฅผ ํตํ header ๊ณต๋ถ (0) | 2021.10.22 |
Event Loop & Task queue ์ด๋ฒคํธ ๋ฃจํ์ ํ์คํฌ ํ (0) | 2021.09.18 |
URI ๊ทธ๋ฆฌ๊ณ URL, URN (0) | 2021.09.11 |
Client - Server : SOP์ CORS (0) | 2021.09.10 |
๋๊ธ