XMLHttpRequest
XMLHttpRequest (qisqacha XHR) โ bu tarmoq so'rovlarini yuborishning eski, ammo hali ham amalda uchraydigan usuli. Bugungi kunda fetch afzal ko'riladi, lekin XHR'ni bilish muhim: eski loyihalarda uchraydi va u fetchda yo'q ba'zi imkoniyatlarga (masalan, upload progress) ega.
XHR nima uchun kerak?
Zamonaviy koda deyarli har doim fetch ishlatiladi. Ammo XHR'ni o'rganishning sabablari bor:
- Eski kod: ko'p mavjud loyihalarda XHR ishlatilgan, ularni tushunish va qo'llab-quvvatlash kerak;
- Upload progress:
fetchyuklab jo'natish (upload) jarayonini kuzata olmaydi, XHR esa buni qila oladi; - Keng qo'llab-quvvatlash: XHR juda eski brauzerlarda ham ishlaydi.
Asosiy sintaksis: open va send
XHR bilan so'rov yuborish uch bosqichdan iborat: obyekt yaratish, sozlash (open) va yuborish (send):
// 1) Obyekt yaratamiz
let xhr = new XMLHttpRequest();
// 2) So'rovni sozlaymiz
xhr.open('GET', 'https://example.com/data', true);
// 3) Yuboramiz
xhr.send();
xhr.open(method, url, async) parametrlari:
methodโ HTTP metodi (GET, POST va h.k.);urlโ so'rov manzili;asyncโtruebo'lsa asinxron (tavsiya etiladi),falsebo'lsa sinxron.
open so'rovni yubormaydi, faqat sozlaydi. Haqiqiy so'rov send() chaqirilganda boshlanadi.Hodisalar: onload, onerror, onprogress
XHR asinxron ishlagani uchun natijani hodisalar (events) orqali olamiz. Eng muhimlari:
load(onload) โ so'rov tugadi va javob keldi (holat qanday bo'lishidan qat'i nazar);error(onerror) โ so'rov bajarilmadi (masalan, tarmoq uzildi);progress(onprogress) โ javob yuklanayotganda davriy chaqiriladi (progress uchun).
let xhr = new XMLHttpRequest();
xhr.open('GET', '/data.json', true);
xhr.onload = function () {
if (xhr.status >= 200 && xhr.status < 300) {
// Muvaffaqiyat
let data = JSON.parse(xhr.responseText);
console.log('Ma'lumot: ', data);
} else {
// HTTP xatolik (404, 500 va h.k.)
console.log('HTTP xatolik: ' + xhr.status);
}
};
xhr.onerror = function () {
// Tarmoq xatoligi
console.log('So'rov bajarilmadi (tarmoq xatoligi)');
};
xhr.send();
fetchdagidek, onload HTTP xatoliklarda (404, 500) ham chaqiriladi โ chunki server javob bergan. Shuning uchun xhr.statusni o'zimiz tekshiramiz. onerror esa faqat tarmoq umuman ishlamaganda ishlaydi.Javob xossalari
So'rov tugagach javobni quyidagi xossalar orqali olamiz:
xhr.statusโ HTTP holat kodi (200, 404, 500 ...);xhr.statusTextโ holat matni ('OK', 'Not Found' ...);xhr.responseTextโ javob tanasi matn sifatida;xhr.responseโ javob tanasi (responseTypega qarab turli formatda).
xhr.responseType = 'json'; // brauzer JSON'ni avtomatik tahlil qiladi
xhr.onload = function () {
// Endi xhr.response โ tayyor obyekt (JSON.parse shart emas)
console.log(xhr.response.name);
};
Progressni kuzatish
XHR'ning kuchli tomoni โ u ham yuklab olish, ham yuklab jo'natish progressini kuzata oladi:
let xhr = new XMLHttpRequest();
xhr.open('GET', '/big-file', true);
// Yuklab olish progressi
xhr.onprogress = function (event) {
if (event.lengthComputable) {
let percent = Math.round((event.loaded / event.total) * 100);
console.log('Yuklandi: ' + percent + '%');
} else {
console.log('Yuklandi: ' + event.loaded + ' bayt (umumiy hajm noma'lum)');
}
};
xhr.send();
progress hodisasining obyekti quyidagi maydonlarga ega:
event.loadedโ hozirgacha yuklangan baytlar soni;event.totalโ umumiy baytlar soni;event.lengthComputableโ umumiy hajm ma'lummi (Content-Length bormi).
Upload progress
Fayl yuklab jo'natishda (upload) progressni kuzatish uchun xhr.upload obyektidan foydalanamiz โ bu aynan fetchda yo'q imkoniyat:
let xhr = new XMLHttpRequest();
xhr.open('POST', '/upload', true);
// Yuklab jo'natish progressi
xhr.upload.onprogress = function (event) {
let percent = Math.round((event.loaded / event.total) * 100);
console.log('Jo'natildi: ' + percent + '%');
};
xhr.upload.onload = function () {
console.log('Fayl to'liq jo'natildi');
};
let formData = new FormData();
formData.append('file', fileInput.files[0]);
xhr.send(formData);
fetch upload progressini qo'llab-quvvatlamaydi.Sinxron vs asinxron
openning uchinchi argumenti false bo'lsa, so'rov sinxron bajariladi โ ya'ni send() javob kelguncha kodni bloklaydi:
let xhr = new XMLHttpRequest();
xhr.open('GET', '/data', false); // sinxron!
xhr.send(); // bu yerda kod javob kelguncha KUTADI (bloklanadi)
console.log(xhr.responseText); // javob tayyor
true) ishlating.XHR va fetch: solishtirish
Ikki usulni qiyoslaymiz:
- Sintaksis:
fetchpromise'ga asoslangan, tekis va zamonaviy; XHR โ hodisalarga asoslangan, ko'proq kod talab qiladi; - Xatoliklar: ikkalasi ham HTTP xatoliklarni (404) o'zi tekshirishni talab qiladi;
- Upload progress: XHR qila oladi (
xhr.upload),fetchqila olmaydi; - Download progress: ikkalasi ham qila oladi (fetch โ ReadableStream bilan);
- Bekor qilish:
fetchโAbortControllerbilan, XHR โxhr.abort()bilan; - Zamonaviylik: yangi kod uchun
fetchtavsiya etiladi.
// Bir xil so'rov, ikki usul:
// fetch bilan (zamonaviy):
let response = await fetch('/data.json');
let data = await response.json();
// XHR bilan (eski):
let xhr = new XMLHttpRequest();
xhr.open('GET', '/data.json', true);
xhr.responseType = 'json';
xhr.onload = function () {
let data = xhr.response;
};
xhr.send();
Xulosa
XMLHttpRequest(XHR) โ tarmoq so'rovlarining eski, hodisalarga asoslangan usuli;- Uch bosqich:
new XMLHttpRequest()โxhr.open(method, url, async)โxhr.send(); - Natija hodisalar orqali:
onload(tugadi),onerror(tarmoq xatoligi),onprogress(jarayon); - Javob:
xhr.status,xhr.responseText,xhr.response; xhr.uploadโ yuklab jo'natish progressini kuzatadi (bufetchda yo'q);- Sinxron so'rovlar (
async = false) brauzerni muzlatadi โ ulardan qoching; - Yangi koda odatda
fetchafzal, ammo upload progress kerak bo'lsa XHR foydali.