Neler yeni

Yazılım Forum

Tüm özelliklerimize erişmek için şimdi bize katılın. Kayıt olduktan ve giriş yaptıktan sonra konu oluşturabilecek, mevcut konulara yanıt gönderebilecek, itibar kazanabilecek, özel mesajlaşmaya erişebilecek ve çok daha fazlasını yapabileceksiniz! Bu hizmetlerimiz ise tamamen ücretsiz ve kurallara uyulduğu sürece sınırsızdır, o zaman ne bekliyorsunuz? Hadi, sizde aramıza katılın!

Modern Web Geliştirmede Fetch API ile Veri Çekme: Kapsamlı Bir Rehber

Web uygulamalarında sunucuyla iletişim kurmak, veri almak veya göndermek, modern tarayıcıların sunduğu en temel yeteneklerden biridir. Bu iletişimi sağlamanın en güncel ve güçlü yollarından biri de Fetch API'dir. Geleneksel XMLHttpRequest (XHR) yöntemine kıyasla daha esnek, Promise tabanlı ve kullanımı daha modern bir arayüz sunar.

Fetch API Nedir?

Fetch API, ağ üzerinden kaynakları (genellikle sunucu API'lerinden veri) asenkron olarak çekmek için kullanılan bir JavaScript arayüzüdür. Promise tabanlı yapısı sayesinde, asenkron işlemleri yönetmeyi ve zincirleme çağrılar yapmayı çok daha kolay hale getirir. Bu, özellikle karmaşık veri akışlarına sahip uygulamalar geliştirirken büyük bir avantaj sağlar.

"Fetch API, web sayfalarının ve web uygulamalarının sunucularla asenkron olarak iletişim kurmasını sağlayan, Promise tabanlı bir mekanizmadır. Daha modern ve esnek bir ağ isteği arayüzü sunar."

Neden Fetch API Kullanmalıyız? XMLHttpRequest'ten Farkı Ne?

Bir zamanlar XHR, tarayıcıda asenkron istekler yapmanın tek yolu idi. Ancak Fetch API, XHR'ın bazı dezavantajlarını giderir ve geliştirici deneyimini iyileştirir:

  • Promise Tabanlılık: Fetch, Promise'ler üzerine inşa edilmiştir, bu da `async/await` sentaksı ile harika bir uyum sağlar ve callback cehennemini (callback hell) ortadan kaldırır. XHR ise olay tabanlı (event-based) olduğu için genellikle daha karmaşık bir yapıya sahiptir.
  • Daha Okunabilir Kod: Fetch'in minimalist API'si, istekleri ve yanıtları manipüle etmeyi daha sezgisel hale getirir.
  • Güçlü Kavramlar: Fetch API, `Request`, `Response` ve `Headers` gibi HTTP'nin temel kavramlarını doğrudan JavaScript nesneleri olarak sunar, bu da düşük seviyeli HTTP detaylarına daha iyi erişim sağlar.
  • Service Worker Desteği: Fetch API, Service Worker API ile doğal olarak entegre olur ve çevrimdışı önbellekleme ve ağ isteklerinin manipülasyonu için güçlü yetenekler sunar.

Temel Kullanım: GET İstekleri

Bir API'den veri çekmek için Fetch API'nin en basit kullanımı `fetch()` fonksiyonu ile bir URL'i çağırmaktır. Bu fonksiyon varsayılan olarak bir GET isteği yapar ve bir Promise döndürür. Bu Promise, başarılı bir HTTP yanıtını temsil eden bir `Response` objesi ile çözümlenir.

Kod:
fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => {
    // console.log(response); // Response objesini inceleyebilirsiniz
    if (!response.ok) {
      // HTTP hatası durumunda (örneğin 404, 500)
      throw new Error(`HTTP hatası! Durum: ${response.status}`);
    }
    return response.json(); // Yanıtı JSON olarak ayrıştırma
  })
  .then(data => {
    console.log('Alınan veri:', data);
    // Veriyi DOM'a yerleştirme veya başka işlemler yapma
  })
  .catch(error => {
    console.error('İstek sırasında bir hata oluştu:', error);
    // Hata mesajını kullanıcıya gösterme
  });

Yukarıdaki örnekte, `response.json()` metodu da bir Promise döndürür ve yanıt gövdesini JSON olarak ayrıştırdıktan sonra çözümlenir.

Asenkron Programlama: async/await ile Kullanım

Modern JavaScript'te `async/await` sentaksı, Promise'lerle çalışmayı daha da basitleştirir ve kodun senkron bir akışta yazılmış gibi görünmesini sağlar. Bu, özellikle karmaşık asenkron işlemler zincirinde kod okunabilirliğini artırır.

Kod:
async function getPostData(postId) {
  try {
    const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`);

    if (!response.ok) {
      throw new Error(`HTTP hatası! Durum: ${response.status}`);
    }

    const data = await response.json();
    console.log(`Post ID ${postId} için veri:`, data);
    return data;
  } catch (error) {
    console.error('Veri çekilirken bir hata oluştu:', error);
    // Kullanıcıya hata mesajı gösterebilirsiniz
    return null;
  }
}

getPostData(2);
getPostData(999); // Hata durumunu test etmek için

Hata Yönetimi

Fetch API'da hatalar iki ana kategoriye ayrılır:

  • Ağ Hataları: Örneğin, internet bağlantısının kesilmesi veya sunucuya ulaşılamaması gibi durumlarda `fetch()` Promise'i reddedilir (rejected). Bu tür hatalar `.catch()` bloğu tarafından yakalanır.
  • HTTP Hataları: Sunucudan gelen 4xx (Client Error) veya 5xx (Server Error) durum kodları Fetch API için Promise'i reddetmez. `response.ok` özelliği, yanıtın başarılı (200-299 arası durum kodu) olup olmadığını kontrol etmek için kullanılır. `response.status` özelliği ise HTTP durum kodunu verir. Bu nedenle, `response.ok` kontrolü yaparak HTTP hatalarını manuel olarak yakalamak önemlidir.

Kod:
fetch('https://jsonplaceholder.typicode.com/non-existent-url') // Bilerek yanlış bir URL
  .then(response => {
    if (!response.ok) {
      // Bu blok 404 gibi durum kodları için çalışır
      throw new Error(`Kaynak bulunamadı: ${response.status}`);
    }
    return response.json();
  })
  .catch(error => {
    // Bu blok ağ hataları ve yukarıdaki 'throw' ile fırlatılan hatalar için çalışır
    console.error('Veri çekme işleminde beklenmeyen bir sorun oluştu:', error.message);
  });

Diğer HTTP Metotları: POST, PUT, DELETE

GET dışında diğer HTTP metotlarını kullanmak için `fetch()` fonksiyonuna ikinci bir argüman olarak bir seçenekler objesi (options object) geçirmemiz gerekir. Bu objede `method`, `headers` ve `body` gibi anahtarlar bulunur.

POST İsteği Örneği (Yeni Veri Oluşturma):

Kod:
async function createPost() {
  const newPost = {
    title: 'Yeni Başlık Örneği',
    body: 'Bu, Fetch API ile gönderilen yeni bir gönderi içeriğidir.',
    userId: 1
  };

  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json; charset=UTF-8',
      },
      body: JSON.stringify(newPost), // JS objesini JSON stringine dönüştürme
    });

    if (!response.ok) {
      throw new Error(`POST isteği başarısız oldu! Durum: ${response.status}`);
    }

    const data = await response.json();
    console.log('Yeni gönderi oluşturuldu:', data);
    return data;
  } catch (error) {
    console.error('POST isteği sırasında bir hata oluştu:', error);
    return null;
  }
}

createPost();

PUT İsteği Örneği (Mevcut Veriyi Güncelleme):

Kod:
async function updatePost(postId) {
  const updatedPost = {
    id: postId,
    title: 'Güncellenmiş Başlık',
    body: 'Bu gönderi içeriği PUT metodu ile güncellendi.',
    userId: 1
  };

  try {
    const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`, {
      method: 'PUT',
      headers: {
        'Content-Type': 'application/json; charset=UTF-8',
      },
      body: JSON.stringify(updatedPost),
    });

    if (!response.ok) {
      throw new Error(`PUT isteği başarısız oldu! Durum: ${response.status}`);
    }

    const data = await response.json();
    console.log(`Gönderi ${postId} güncellendi:`, data);
    return data;
  } catch (error) {
    console.error('PUT isteği sırasında bir hata oluştu:', error);
    return null;
  }
}

updatePost(1);

DELETE İsteği Örneği (Veri Silme):

Kod:
async function deletePost(postId) {
  try {
    const response = await fetch(`https://jsonplaceholder.typicode.com/posts/${postId}`, {
      method: 'DELETE',
    });

    if (!response.ok) {
      throw new Error(`DELETE isteği başarısız oldu! Durum: ${response.status}`);
    }

    // DELETE isteği genellikle boş bir yanıt veya bir durum objesi döndürür.
    // Bazı API'lar boş yanıt döndürdüğü için response.json() hata verebilir.
    // Yanıtın boyutunu veya Content-Type'ını kontrol etmek iyi bir pratik olabilir.
    if (response.status === 200 || response.status === 204) {
        console.log(`Gönderi ${postId} başarıyla silindi.`);
    } else {
        const data = await response.json(); // Bazı API'lar yine de bir yanıt dönebilir
        console.log(`Gönderi ${postId} silindi, yanıt:`, data);
    }
    return true;
  } catch (error) {
    console.error('DELETE isteği sırasında bir hata oluştu:', error);
    return false;
  }
}

deletePost(1);

İleri Seviye Seçenekler ve Objeler

Fetch API, HTTP isteklerini daha detaylı kontrol etmek için `Request`, `Response` ve `Headers` gibi özel nesneler sunar:

  • Request Objeleri: Bir `Request` objesi oluşturarak, daha karmaşık istekleri parametreler halinde tanımlayabilir ve daha sonra `fetch()` fonksiyonuna iletebilirsiniz. Bu, özellikle istek konfigürasyonunu yeniden kullanmak istediğinizde faydalıdır.
    Kod:
    const myRequest = new Request('https://api.example.com/data', {
      method: 'GET',
      headers: new Headers({
        'Content-Type': 'application/json',
        'Authorization': 'Bearer YOUR_TOKEN'
      })
    });
    
    fetch(myRequest)
      .then(response => response.json())
      .then(data => console.log(data));
  • Headers Objeleri: `Headers` objesi, HTTP başlıklarını programatik olarak yönetmek için kullanılır. Anahtar/değer çiftleri ekleyebilir, silebilir veya kontrol edebilirsiniz.
    Kod:
    const myHeaders = new Headers();
    myHeaders.append('Content-Type', 'application/json');
    myHeaders.append('X-Custom-Header', 'Value');
    
    console.log(myHeaders.get('Content-Type')); // application/json
  • Response Objeleri: `fetch()` tarafından döndürülen `Response` objesi, yanıtın durumu (`status`, `statusText`, `ok`), başlıkları (`headers`) ve gövdesini (`json()`, `text()`, `blob()`, `arrayBuffer()`, `formData()`) içerir. Bu, yanıtı farklı formatlarda işlemek için geniş imkanlar sunar.

İstek İptali: AbortController

Uzun süren veya artık gerekmeyen Fetch isteklerini iptal etmek, özellikle SPA'larda (Single Page Application) performansı ve kaynak yönetimini iyileştirmek için önemlidir. AbortController bu amaçla kullanılır.

Kod:
const controller = new AbortController();
const signal = controller.signal;

async function fetchDataWithCancellation() {
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/todos/1', {
      signal: signal // Signal'ı isteğe ekleme
    });

    if (!response.ok) {
      throw new Error(`HTTP hatası! Durum: ${response.status}`);
    }

    const data = await response.json();
    console.log('Veri alındı (iptal edilmedi):', data);
  } catch (error) {
    if (error.name === 'AbortError') {
      console.log('İstek başarıyla iptal edildi.');
    } else {
      console.error('Beklenmeyen hata:', error);
    }
  }
}

fetchDataWithCancellation();

// 100 milisaniye sonra isteği iptal et
setTimeout(() => {
  controller.abort();
  console.log('İptal sinyali gönderildi.');
}, 50);

CORS (Cross-Origin Resource Sharing)

Web güvenliği nedeniyle, tarayıcılar farklı kaynaklardan (domain, protokol veya port farklılığı) yapılan HTTP isteklerini kısıtlar. Bu, aynı kaynak politikası (Same-Origin Policy) olarak bilinir. Fetch API ile farklı bir domaindeki API'ye istek yaptığınızda, sunucunun uygun CORS başlıklarını (örneğin, `Access-Control-Allow-Origin`) göndermesi gerekir, aksi takdirde tarayıcı isteği engeller.

"CORS, tarayıcının farklı kaynaklardan kaynak talep etmesine izin vermek için HTTP başlıklarını kullanan bir mekanizmadır. Geliştiricilerin web güvenliğini korurken esneklik sağlamasına olanak tanır."

Tarayıcı Uyumluluğu

Fetch API modern tarayıcıların çoğunda (Chrome, Firefox, Safari, Edge) desteklenmektedir. Internet Explorer gibi eski tarayıcılar için bir polyfill (örneğin `whatwg-fetch`) kullanmanız gerekebilir.

En İyi Uygulamalar

  • Kapsamlı Hata Yönetimi: Hem ağ hatalarını hem de HTTP durum kodlarından kaynaklanan hataları doğru bir şekilde ele alın.
  • AbortController Kullanımı: Özellikle kullanıcı navigasyonu gibi durumlarda gereksiz istekleri iptal ederek kaynakları koruyun.
  • Ortak Fonksiyonlar Oluşturma: Tekrarlayan kod bloklarını (örneğin, token ekleme, hata mesajı gösterme) merkezi bir yardımcı fonksiyonda toplayın.
  • URL Parametreleri ve Sorgu Dizileri: Parametreleri elle birleştirmek yerine, URLSearchParams API'sini kullanarak daha güvenli ve okunaklı URL'ler oluşturun.
  • Timeout Yönetimi: Fetch API'nin yerleşik bir timeout özelliği yoktur. Ancak, `AbortController` ve `Promise.race()` kombinasyonu ile bir timeout mekanizması uygulayabilirsiniz.
    Kod:
    function fetchWithTimeout(url, options = {}, timeout = 5000) {
      const controller = new AbortController();
      const id = setTimeout(() => controller.abort(), timeout);
    
      return fetch(url, {
        ...options,
        signal: controller.signal
      }).finally(() => clearTimeout(id));
    }
    
    fetchWithTimeout('https://jsonplaceholder.typicode.com/posts', {}, 100) // Kısa timeout
      .then(response => response.json())
      .then(data => console.log(data))
      .catch(error => {
        if (error.name === 'AbortError') {
          console.error('İstek zaman aşımına uğradı!');
        } else {
          console.error('Hata:', error);
        }
      });
  • Önbellekleme: Gereksiz ağ isteklerini azaltmak için, sunucu tarafında veya tarayıcıda (Service Workers ile) önbellekleme mekanizmalarını kullanın.

Sonuç

Fetch API, modern web geliştiricileri için vazgeçilmez bir araçtır. Promise tabanlı yapısı, `async/await` ile mükemmel entegrasyonu ve HTTP'nin temel kavramlarını doğrudan JavaScript objeleri olarak sunması sayesinde, ağ isteklerini yönetmeyi çok daha güçlü, esnek ve keyifli hale getirir. Bu rehberde bahsedilen temel kullanım, hata yönetimi, diğer HTTP metotları, ileri seviye seçenekler ve en iyi uygulamalar ile Fetch API'nin sunduğu potansiyeli tam olarak keşfedebilir ve daha sağlam, performanslı web uygulamaları geliştirebilirsiniz.
 
shape1
shape2
shape3
shape4
shape5
shape6
Üst

Bu web sitenin performansı Hazal Host tarafından sağlanmaktadır.

YazilimForum.com.tr internet sitesi, 5651 sayılı Kanun’un 2. maddesinin 1. fıkrasının (m) bendi ve aynı Kanun’un 5. maddesi kapsamında Yer Sağlayıcı konumundadır. Sitede yer alan içerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır.

YazilimForum.com.tr, kullanıcılar tarafından paylaşılan içeriklerin doğruluğunu, güncelliğini veya hukuka uygunluğunu garanti etmez ve içeriklerin kontrolü veya araştırılması ile yükümlü değildir. Kullanıcılar, paylaştıkları içeriklerden tamamen kendileri sorumludur.

Hukuka aykırı içerikleri fark ettiğinizde lütfen bize bildirin: lydexcoding@gmail.com

Sitemiz, kullanıcıların paylaştığı içerik ve bilgileri 6698 sayılı KVKK kapsamında işlemektedir. Kullanıcılar, kişisel verileriyle ilgili haklarını KVKK Politikası sayfasından inceleyebilir.

Sitede yer alan reklamlar veya üçüncü taraf bağlantılar için YazilimForum.com.tr herhangi bir sorumluluk kabul etmez.

Sitemizi kullanarak Forum Kuralları’nı kabul etmiş sayılırsınız.

DMCA.com Protection Status Copyrighted.com Registered & Protected