55- آموزش جاوااسکریپت | آموزش جامع Fetch API : جایگزین مدرن AJAX
در این آموزش با Fetch API، استاندارد مدرن جاوااسکریپت برای مدیریت درخواستهای HTTP آشنا میشوید. یاد میگیرید چگونه فایلهای متنی و JSON محلی را فراخوانی کنید و با استفاده از APIهای خارجی مانند GitHub، دادهها را دریافت و در صفحه وب نمایش دهید.
کار با Fetch API در جاوااسکریپت
در جاوااسکریپت مدرن، Fetch API استانداردی قدرتمند برای ارسال درخواستهای HTTP و دریافت اطلاعات از منابع محلی یا سرورهای اینترنتی است. این ابزار به عنوان جایگزین مستقیم و استاندارد برای XMLHttpRequest (رویکرد قدیمی AJAX) معرفی شده است.
متد fetch به صورت پیشفرض در شیء window مرورگرها در دسترس است و مستقیماً یک Promise برمیگرداند؛ بنابراین مدیریت پاسخها و خطاها در آن از طریق .then() و .catch() انجام میشود.
در این آموزش، نحوه دریافت سه نوع منبع داده با استفاده از Fetch API پیادهسازی میشود:
- دریافت محتوای یک فایل متنی ساده (
.txt) - دریافت دادههای ساختاریافته از یک فایل محلی (
.json) - دریافت دادههای زنده از یک سرویس خارجی (GitHub API)
ساختار اولیه سند HTML
برای اجرای سناریوها، به سه دکمه جهت ایجاد رویداد و یک تگ div برای نمایش خروجی نیاز است:
<button id="button1">Get Text</button>
<button id="button2">Get JSON</button>
<button id="button3">Get External API Data</button>
<div id="output"></div>
۱. دریافت محتوای فایل متنی ساده (Text File)
ابتدا یک فایل متنی محلی به نام test.txt با محتوای دلخواه ایجاد میکنیم:
This is a sample text file.
سپس در فایل جاوااسکریپت، رویداد کلیک برای دکمه اول تعریف میشود:
document.getElementById('button1').addEventListener('click', getText);
function getText() {
fetch('test.txt')
.then(function(res) {
return res.text();
})
.then(function(data) {
document.getElementById('output').innerHTML = data;
})
.catch(function(err) {
console.log(err);
});
}
نحوه عملکرد:
- متد
fetch('test.txt')اجرا شده و یک Promise حاوی شیءResponseبرمیگرداند. - شیء
Responseمتدهای متعددی در پروتوتایپ خود دارد. برای خواندن متن ساده از متدres.text()استفاده میشود. - چون
res.text()خود یک Promise دیگر برمیگرداند، آن راreturnکرده و در زنجیره بعدی با یک.then()دیگر، متن نهایی (data) را دریافت و درون عنصر#outputدرج میکنیم. - متد
.catch()خطاهای مربوط به عدم دسترسی به منبع یا شبکه را مدیریت میکند.
۲. دریافت داده از فایل محلی JSON
یک فایل به نام posts.json ایجاد کرده و ساختار آرایهای زیر را درون آن قرار میدهیم:
[
{
"title": "Post One",
"body": "This is post one"
},
{
"title": "Post Two",
"body": "This is post two"
},
{
"title": "Post Three",
"body": "This is post three"
}
]
سپس تابع مربوط به دکمه دوم پیادهسازی میشود:
document.getElementById('button2').addEventListener('click', getJson);
function getJson() {
fetch('posts.json')
.then(function(res) {
return res.json();
})
.then(function(data) {
let output = '';
data.forEach(function(post) {
output += `<li>${post.title}</li>`;
});
document.getElementById('output').innerHTML = output;
})
.catch(function(err) {
console.log(err);
});
}
نحوه عملکرد:
- بهجای متد
text()، ازres.json()استفاده میشود. این متد به صورت خودکار دادههای متنی با ساختار JSON را به یک شیء یا آرایه قابل پیمایش در جاوااسکریپت تبدیل میکند. - چون خروجی یک آرایه است، با متد
forEachروی اعضای آن حلقه زده و مقادیر موردنظر (در اینجاpost.title) درون یک رشته HTML تجمیع و در صفحه رندر میشوند.
۳. دریافت داده از API خارجی (GitHub API)
مراحل کار برای دریافت اطلاعات از یک سرور خارجی دقیقاً مشابه فایل محلی است؛ کافی است آدرس URL وبسرویس به fetch پاس داده شود:
document.getElementById('button3').addEventListener('click', getExternal);
function getExternal() {
fetch('https://api.github.com/users')
.then(function(res) {
return res.json();
})
.then(function(data) {
let output = '';
data.forEach(function(user) {
output += `<li>${user.login}</li>`;
});
document.getElementById('output').innerHTML = output;
})
.catch(function(err) {
console.log(err);
});
}
نحوه عملکرد:
- آدرس
https://api.github.com/usersلیستی از کاربران گیتهاب را در قالب فرمت JSON بازمیگرداند. - داده با
res.json()پارس شده و برای هر کاربر، مقدار ویژگیuser.loginبه عنوان نام کاربری در لیست HTML چاپ میشود.
کد کامل و یکپارچه جاوااسکریپت
// رویدادهای دکمهها
document.getElementById('button1').addEventListener('click', getText);
document.getElementById('button2').addEventListener('click', getJson);
document.getElementById('button3').addEventListener('click', getExternal);
// ۱. دریافت فایل متنی
function getText() {
fetch('test.txt')
.then(function(res) {
return res.text();
})
.then(function(data) {
document.getElementById('output').innerHTML = data;
})
.catch(function(err) {
console.log(err);
});
}
// ۲. دریافت فایل جیسون محلی
function getJson() {
fetch('posts.json')
.then(function(res) {
return res.json();
})
.then(function(data) {
let output = '';
data.forEach(function(post) {
output += `<li>${post.title}</li>`;
});
document.getElementById('output').innerHTML = output;
})
.catch(function(err) {
console.log(err);
});
}
// ۳. دریافت از API خارجی
function getExternal() {
fetch('https://api.github.com/users')
.then(function(res) {
return res.json();
})
.then(function(data) {
let output = '';
data.forEach(function(user) {
output += `<li>${user.login}</li>`;
});
document.getElementById('output').innerHTML = output;
})
.catch(function(err) {
console.log(err);
});
}
نکات کلیدی
- دو مرحلهای بودن پردازش: متد
fetchدر گام اول یک شیءResponseبازمیگرداند؛ برای استخراج محتوای واقعی بسته به جنس داده باید متدهایres.text()یاres.json()فراخوانی و در.then()بعدی مدیریت شوند. - پردازش خطای شبکه: متد
.catch()در انتهای زنجیره خطاهای مرتبط با ارسال درخواست را ثبت میکند.