Tüm blog yazıları

XMLHttpRequest (XHR)

JavaScript'in HTTP istekleri için ilk yöntemi olan XMLHttpRequest (XHR) ile tanışın. Günümüzde Fetch API ve Axios öne çıksa da, XHR'ın tarihi bağlamını, temel kullanımını ve neden hala bilmemiz gerektiğini bu rehberde keşfedin. Web gelişimindeki yerini anlayın.

eminbasbayan7 dk okuma
XMLHttpRequest (XHR) nedir? JavaScript ile API isteği yapmanın temel adımları ve kod örneği.

Şimdiye kadar API'lerin ne olduğunu, HTTP isteklerinin nasıl çalıştığını ve Hoppscotch gibi araçlarla nasıl test edileceğini öğrendik. Şimdi sıra geldi JavaScript ile istek yapmaya.

Bu makalede JavaScript'in orijinal istek yapma yöntemi olan XMLHttpRequest (XHR) ile tanışacağız. Spoiler: Bu yöntem artık pek kullanılmıyor, ama nereden geldiğimizi anlamak için bilmek önemli.

XMLHttpRequest Nedir?

XMLHttpRequest, JavaScript'te HTTP isteği yapmak için kullanılan ilk ve en eski yöntemdir. 1999 yılında Microsoft tarafından geliştirildi ve tüm tarayıcılar tarafından desteklendi.

İsmi Neden XML?

O dönemde veri formatı olarak XML popülerdi. Bugün JSON kullanıyoruz ama isim değişmedi. Garip ama böyle.

Büyük/Küçük Harf Karmaşası

metin
XMLHttpRequest
^^^   ^
XML   H büyük, ttp küçük

"HTTP" normalde tamamen büyük harf yazılır ama burada sadece "H" büyük. Bu tutarsızlık herkesi rahatsız eder ama yapacak bir şey yok.

Neden Öğreniyoruz?

XHR artık günlük geliştirmede kullanılmıyor. Yerini Fetch API ve Axios aldı. Peki neden öğreniyoruz?

  1. Tarihi bağlam - JavaScript'in evrimini anlamak
  2. Eski kodlar - Legacy projelerde karşılaşabilirsiniz
  3. Minnettarlık - Modern araçların ne kadar iyi olduğunu takdir etmek

Önemli: Bu sözdizimini ezberlemenize gerek yok. Sadece mantığı anlayın.

Temel Kullanım

Adım 1: XHR Nesnesi Oluşturma

javascript
const xhr = new XMLHttpRequest();

Adım 2: Event Listener'ları Tanımlama

javascript
xhr.onload = function() {
    // İstek başarılı olduğunda çalışır
    console.log("Başarılı!");
    console.log(this.responseText);
};

xhr.onerror = function() {
    // Hata olduğunda çalışır
    console.log("Hata oluştu!");
};

Adım 3: İsteği Açma

javascript
xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1");

İlk parametre HTTP metodu, ikinci parametre URL.

Adım 4: İsteği Gönderme

javascript
xhr.send();

Tam Kod

javascript
// 1. XHR nesnesi oluştur
const xhr = new XMLHttpRequest();

// 2. Başarı durumunda ne yapılacak
xhr.onload = function() {
    console.log("Yanıt alındı:");
    console.log(this.responseText);
};

// 3. Hata durumunda ne yapılacak
xhr.onerror = function() {
    console.log("Bir hata oluştu!");
};

// 4. İsteği hazırla (GET metodu, URL)
xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1");

// 5. İsteği gönder
xhr.send();

Yanıtı İşleme

responseText bir string'dir. JSON olarak kullanmak için parse etmeliyiz:

javascript
const xhr = new XMLHttpRequest();

xhr.onload = function() {
    // responseText bir string
    console.log(typeof this.responseText);  // "string"

    // JSON.parse ile nesneye çevir
    const veri = JSON.parse(this.responseText);

    // Artık nesne olarak kullanabiliriz
    console.log(veri.title);
    console.log(veri.body);
};

xhr.onerror = function() {
    console.log("Hata!");
};

xhr.open("GET", "https://jsonplaceholder.typicode.com/posts/1");
xhr.send();

Çıktı:

metin
sunt aut facere repellat provident occaecati excepturi optio reprehenderit
quia et suscipit...

Pratik Örnek: Kullanıcı Bilgisi Getirme

javascript
function kullaniciBilgisiGetir(id) {
    const xhr = new XMLHttpRequest();

    xhr.onload = function() {
        if (this.status === 200) {
            const kullanici = JSON.parse(this.responseText);
            console.log("İsim:", kullanici.name);
            console.log("Email:", kullanici.email);
            console.log("Şehir:", kullanici.address.city);
        } else {
            console.log("Hata kodu:", this.status);
        }
    };

    xhr.onerror = function() {
        console.log("Ağ hatası!");
    };

    xhr.open("GET", `https://jsonplaceholder.typicode.com/users/${id}`);
    xhr.send();
}

// Kullanım
kullaniciBilgisiGetir(1);

Çıktı:

metin
İsim: Leanne Graham
Email: Sincere@april.biz
Şehir: Gwenborough

Durum Kodunu Kontrol Etme

onload çağrıldı diye her şey yolunda demek değil. Durum kodunu kontrol etmeliyiz:

javascript
xhr.onload = function() {
    if (this.status >= 200 && this.status < 300) {
        // Başarılı (2xx)
        const veri = JSON.parse(this.responseText);
        console.log("Başarılı:", veri);
    } else if (this.status === 404) {
        console.log("Kaynak bulunamadı!");
    } else if (this.status === 500) {
        console.log("Sunucu hatası!");
    } else {
        console.log("Beklenmeyen durum:", this.status);
    }
};

XHR'nin Sorunları

Sorun 1: Callback Hell (Cehennem)

Birden fazla ardışık istek yapmak istediğinizde iç içe callback'ler oluşur:

javascript
// İlk istek: Kullanıcıyı getir
const xhr1 = new XMLHttpRequest();
xhr1.onload = function() {
    const kullanici = JSON.parse(this.responseText);
    console.log("Kullanıcı:", kullanici.name);

    // İkinci istek: Kullanıcının postlarını getir
    const xhr2 = new XMLHttpRequest();
    xhr2.onload = function() {
        const postlar = JSON.parse(this.responseText);
        console.log("Post sayısı:", postlar.length);

        // Üçüncü istek: İlk postun yorumlarını getir
        const xhr3 = new XMLHttpRequest();
        xhr3.onload = function() {
            const yorumlar = JSON.parse(this.responseText);
            console.log("Yorum sayısı:", yorumlar.length);

            // Dördüncü istek...
            // Daha da içeri...
            // Daha da içeri...
        };
        xhr3.open("GET", `https://jsonplaceholder.typicode.com/posts/${postlar[0].id}/comments`);
        xhr3.send();
    };
    xhr2.open("GET", `https://jsonplaceholder.typicode.com/users/${kullanici.id}/posts`);
    xhr2.send();
};
xhr1.open("GET", "https://jsonplaceholder.typicode.com/users/1");
xhr1.send();

Bu kod:

  • Okunması zor
  • Bakımı zor
  • Hata yönetimi karmaşık
  • Test edilmesi zor

Bu duruma "Callback Hell" veya "Pyramid of Doom" denir.

Sorun 2: Promise Desteği Yok

XHR, Promise döndürmez. Bu yüzden:

  • async/await kullanamayız
  • .then() zinciri yapamayız
  • Modern JavaScript patterns'lerini uygulayamayız

Sorun 3: Sözdizimi Karmaşık

Basit bir GET isteği için bile:

  1. Nesne oluştur
  2. Event listener'lar tanımla
  3. open() çağır
  4. send() çağır

4 ayrı adım, 10+ satır kod.

Sorun 4: Manuel JSON Parse

Her seferinde JSON.parse() çağırmak gerekiyor. Unutursanız string ile uğraşırsınız.

XHR ile POST İsteği

POST yaparken body göndermemiz gerekir:

javascript
const xhr = new XMLHttpRequest();

xhr.onload = function() {
    if (this.status === 201) {
        const yeniKayit = JSON.parse(this.responseText);
        console.log("Oluşturuldu! ID:", yeniKayit.id);
    }
};

xhr.onerror = function() {
    console.log("Hata!");
};

// POST isteği aç
xhr.open("POST", "https://jsonplaceholder.typicode.com/posts");

// Content-Type header'ı ekle
xhr.setRequestHeader("Content-Type", "application/json");

// Body'yi JSON string olarak gönder
const veri = {
    title: "Yeni Başlık",
    body: "Bu bir test içeriğidir.",
    userId: 1
};

xhr.send(JSON.stringify(veri));

Dikkat edin:

  • setRequestHeader() ile header ekliyoruz
  • JSON.stringify() ile nesneyi string'e çeviriyoruz
  • send() içine body'yi veriyoruz

XHR Özellikleri ve Metodları

Özellikler

ÖzellikAçıklama
responseTextYanıt gövdesi (string)
statusHTTP durum kodu (200, 404, vb.)
statusTextDurum mesajı ("OK", "Not Found", vb.)
readyStateİsteğin durumu (0-4 arası)

Metodlar

MetodAçıklama
open(method, url)İsteği hazırla
send(body)İsteği gönder
setRequestHeader(name, value)Header ekle
abort()İsteği iptal et

Event'ler

EventNe Zaman Tetiklenir
onloadİstek tamamlandığında
onerrorAğ hatası olduğunda
onprogressİndirme ilerlerken
onreadystatechangereadyState değiştiğinde

readyState Değerleri

readyState isteğin hangi aşamada olduğunu gösterir:

DeğerSabitAnlam
0UNSENTİstek oluşturulmadı
1OPENEDopen() çağrıldı
2HEADERS_RECEIVEDHeader'lar alındı
3LOADINGYanıt yükleniyor
4DONEİşlem tamamlandı
javascript
xhr.onreadystatechange = function() {
    console.log("readyState:", this.readyState);

    if (this.readyState === 4) {
        if (this.status === 200) {
            console.log("Başarılı!");
        }
    }
};

Not: onload kullanmak daha pratik. onreadystatechange eski yöntem.

XHR vs Modern Yöntemler

ÖzellikXHRFetchAxios
Promise❌✅✅
async/await❌✅✅
Otomatik JSON❌❌✅
SözdizimiKarmaşıkOrtaBasit
Tarayıcı desteğiTüm tarayıcılarModern tarayıcılarKütüphane gerekli

Ne Zaman XHR Kullanılır?

Kullanın:

  • IE11 gibi çok eski tarayıcıları desteklemeniz gerekiyorsa
  • Yükleme progress'i takip etmeniz gerekiyorsa (Fetch'te sınırlı)
  • Legacy kod bakımı yapıyorsanız

Kullanmayın:

  • Yeni projeler
  • Modern tarayıcıları hedefliyorsanız
  • Promise tabanlı kod yazıyorsanız

Özet

KonuAçıklama
XHRJavaScript'te HTTP isteği yapmanın ilk yöntemi
Kullanımnew XMLHttpRequest() → onload → open() → send()
JSON ParseJSON.parse(this.responseText)
SorunlarıCallback hell, Promise yok, karmaşık sözdizimi
GünümüzdeFetch API ve Axios tercih ediliyor

Sırada Ne Var?

XHR'nin zorluklarını gördük. Şimdi modern ve çok daha kullanışlı bir yönteme geçiyoruz.

Bir sonraki makalede Fetch API ile tanışacağız - Promise tabanlı, temiz sözdizimli, modern JavaScript'in istek yapma yöntemi.

JavaScript Classes ile pratik uygulamalar, metotlar arası iletişim ve gerçek dünya kod örnekleri
JavaScript Dersleri9 dk okuma

JavaScript Classes - Pratik Uygulamalar

JavaScript class'ları ile pratik uygulamalara geçin! Metotlar arası iletişimden constructor'da metot çağırmaya, kod tekrarını azaltmaktan gerçek dünya senaryolarına kadar class kullanımının inceliklerini keşfedin. Kendi alışveriş sepeti örneğinizle bilginizi pekiştirin.

Yazıyı oku
JavaScript class yapısını gösteren bir kod örneği, ES6 ile modern nesne oluşturma
JavaScript Dersleri9 dk okuma

JavaScript Classes

ES6 ile JavaScript'e gelen class yapısı sayesinde nesne oluşturmak artık çok daha kolay ve düzenli! Constructor function karmaşasından kurtulup, okunabilir ve yönetilebilir kodlar yazmak isteyenler için modern JavaScript'in temel taşı olan class'ları tüm detaylarıyla keşfedin. Bu rehberle nesne şabl

Yazıyı oku
JavaScript kodunda Constructor Function ve new keyword'ü ile nesne oluşturma örnekleri
JavaScript Dersleri8 dk okuma

Constructor Functions ve new Keyword

Factory Function'ların hafıza israfı sorununa Constructor Function'lar ve new keyword'ü ile son verin! Metotları paylaştırarak JavaScript objelerini daha verimli nasıl oluşturacağınızı, new'in perde arkasında neler yaptığını ve prototype sisteminin gücünü bu rehberde keşfedin.

Yazıyı oku

Çerez tercihlerin

Platformun çalışması için zorunlu çerezler kullanıyoruz. İzin verirsen anonim kullanım verilerini ölçüyoruz. Ayrıntıları incele