Fetch API
fetch() দিয়ে ডেটা আনা, response কনভার্ট, error handling, POST + async/await — সম্পূর্ণ বাংলা গাইড।
Fetch API হলো ব্রাউজারের built-in উপায় — নেটওয়ার্ক থেকে ডেটা আনা-পাঠানো করতে। এটি Promise-ভিত্তিক।
GET রিকোয়েস্ট
fetch("https://api.example.com/users")
.then((response) => response.json())
.then((users) => console.log(users))
.catch((error) => console.error(error));async/await দিয়ে
async function loadUsers() {
try {
const response = await fetch(
"https://api.example.com/users"
);
if (!response.ok) {
throw new Error("নেটওয়ার্ক ভুল");
}
const users = await response.json();
console.log(users);
} catch (error) {
console.error("ডেটা আনা ব্যর্থ:", error);
}
}
loadUsers();response.ok false হলে (যেমন 404) json() এখনও চলে, তাই এর আগেই চেক করা ভালো অভ্যাস।
POST রিকোয়েস্ট
const newUser = {
name: "রহিম",
email: "rahim@example.com",
};
fetch("https://api.example.com/users", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(newUser),
})
.then((response) => response.json())
.then((data) => console.log("তৈরি হয়েছে:", data));PUT — সম্পূর্ণ বদল
async function updateUser(id, updated) {
const res = await fetch(`https://api.example.com/users/${id}`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(updated),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
// পুরো object-টি প্রতিস্থাপন
await updateUser(1, { name: "করিম", email: "karim@example.com" });PUT পুরো resource-টি নতুন মান দিয়ে বদলে দেয় — পাশের ফিল্ড বাদ গেলে সেগুলো মুছে যাবার ঝুঁকি (কোনো না থাকলে)।
PATCH — আংশিক বদল
async function patchUser(id, updates) {
const res = await fetch(`https://api.example.com/users/${id}`, {
method: "PATCH",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(updates),
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
}
// শুধু ভাঙা field
await patchUser(1, { email: "new@example.com" });PATCH কেবল দেওয়া ফিল্ডগুলো বদলায় — বাকি name-এর মতো property অক্ষত থাকে। আলাদা মানে আলাদা।
DELETE
async function deleteUser(id) {
const res = await fetch(`https://api.example.com/users/${id}`, {
method: "DELETE",
});
if (!res.ok && res.status !== 204) {
throw new Error(`HTTP ${res.status}`);
}
console.log("মুছে ফেলা হয়েছে");
}
await deleteUser(1);DELETE-তে সাধারণত body-তে উত্তর নেই — success মানে 204 No Content বা প্রশাসনের status। 204-তে res.json() নেই, তাই চেক ঠিক করুন।
Headers — শিরোনাম কাস্টমাইজ
const headers = new Headers();
headers.set("Content-Type", "application/json");
headers.set("Authorization", "Bearer " + token);
const res = await fetch("/api/private", {
method: "GET",
headers,
});
// উত্তরের headers পড়া
console.log(res.headers.get("content-type"));Headers object-এর সাহায্যে অনেক header ঠিক রাখা ও পড়া যায় — auth token, content-type, ইত্যাদি। অথবা সরলভাবে object literal-ও কাজ করে।
Error handling — একসাথে
async function request(url, options = {}) {
try {
const res = await fetch(url, options);
if (!res.ok) {
throw new Error(`HTTP ${res.status} ${res.statusText}`);
}
const contentType = res.headers.get("content-type") || "";
return contentType.includes("application/json")
? await res.json()
: await res.text();
} catch (err) {
// network error / non-2xx
throw new Error("রিকোয়েস্ট ব্যর্থ: " + err.message);
}
}
// ব্যবহার
const users = await request("/api/users");
await request("/api/users/1", { method: "DELETE" });একটি wrapper request() দিয়ে সব method/error-কে এক দরজায় — অ্যাপ-এ এ রকম client-ই চলে।
UI-তে দেখানো
<button id="load">ডেটা লোড</button>
<ul id="list"></ul>
<script>
document.getElementById("load")
.addEventListener("click", async () => {
const res = await fetch("/api/users");
const users = await res.json();
const list = document.getElementById("list");
list.innerHTML = users
.map(u => "<li>" + u.name + "</li>")
.join("");
});
</script>নেটওয়ার্ক বিপর্যয় (offline, server down) catch-এ ধরা পড়ে। data-কে try/catch এ wrap করুন যাতে UI crash না হয়।
fetch → response.json() → data ব্যবহার; ভুল হ্যান্ডলে response.ok চেক + try/catch। এটাই মূল রুটিন।