Neler yeni

Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

  • Merhaba Değerli Ziyaretçimiz, ForumaGel ailesi seni bekliyor! 🌟 Aramıza katılarak güçlü ve samimi topluluğumuzun bir parçası olabilirsin. Burada her üye değerli, her katkı kıymetli. Şimdi üye ol, bizimle birlikte gelişmenin ve keyifli sohbetlerin tadını çıkar! Sevgi ve Saygılarla, ForumaGel Yönetimi ❤️
Yan Yana Banner
Yan Yana Banner
Katılım
7 Nis 2025
Konular
367
Mesajlar
780
Çözümler
1
Tepkime puanı
121
Puan
93
Konum
İstanbul
Web sitesi
forumagel.com
Hazır Kod Bankası - Konu 30: Vue.js ile Web API Çağrıları ve Veri Yönetimi (Fetch veya Axios)




Hazır Kod Bankası Serimizin Otuzuncu Konusu: Vue.js ile Web API Çağrıları ve Veri Yönetimi!

Merhaba arkadaşlar! Vue.js'in temellerini (JavaScript Frontend Frameworklerine Giriş (Vue.js Temelleri)), bileşenleri (Vue.js Bileşenleri (Components) ve Veri İletişimi (Props, Emit)) ve SPA geliştirmek için yönlendirmeyi (Vue.js ile Tek Sayfa Uygulamaları (SPA) ve Vue Router Temelleri)) öğrendik. Ayrıca Client-Side JavaScript ile Web API Tüketimi (Fetch API) ve Asenkron JavaScript (Promises, Async/Await) konularını ele aldık. Şimdi tüm bu bilgileri birleştirmenin ve bir Vue.js bileşeni içinden çalışan bir API'den dinamik veri çekerek sayfamızı güncellemenin zamanı geldi!

Modern SPA'ların ve dinamik web uygulamalarının temel işlevlerinden biri, arka planda bir Web API'den veri çekmek ve bu veriyi kullanıcının arayüzünde göstermektir. Örneğin, bir ürün listesi sayfasının yüklendiğinde API'den güncel ürün verilerini çekip listeyi oluşturması gibi.

Bu konuda, bir Vue bileşeninin yaşam döngüsü içinde API çağrılarını nerede yapacağımızı, bu çağrılar için Fetch API veya popüler Axios kütüphanesini nasıl kullanacağımızı, asenkron sonuçları nasıl yöneteceğimizi ve gelen veriyi bileşenin durumunda (state) saklayarak şablonda nasıl görüntüleyeceğimizi öğreneceğiz.

Ön Gereksinim:
  • Vue.js temelleri ve bileşen kavramı anlaşılmış olmalı.
  • Asenkron JavaScript (Promises, Async/Await) ve Fetch API ile temel API tüketimi konuları anlaşılmış olmalı.
  • Test için çalışan bir Web API'ye (örneğin Python Flask API'sini Veritabanına Bağlama (SQLAlchemy ile) veya Web API Güvenliği Temelleri (Authentication ve Authorization) konularındaki API) erişiminiz olmalı.

2. Vue Bileşeninde API Çağrısı Nerede Yapılmalı? (`mounted` Hook'u)[/B]

Vue bileşenlerinin, oluşturulma, DOM'a eklenme, güncellenme, DOM'dan ayrılma gibi farklı aşamalarında otomatik olarak çalışan özel metotları (veya fonksiyonları) vardır. Bunlara Yaşam Döngüsü Kancaları (Lifecycle Hooks) denir.

Bir bileşen yüklendiğinde (ekrana geldiğinde) ilk veri çekme API çağrıları için en yaygın kullanılan yaşam döngüsü kancası `mounted()`'tır. `mounted()` hook'u, bileşenin kendi şablonu render edilip DOM'a eklendikten sonra çalışır. Bu, DOM elementlerine erişebileceğiniz ve dış kaynaklardan (API gibi) veri çekebileceğiniz anlamına gelir.

JavaScript:
export default { // Bir Vue bileşeni tanımı (SFC mantığıyla düşünelim)
  data() {
    return {
      // API'den gelecek veriyi saklayacak liste/dizi
      urunler: [],
      // Yüklenme durumunu gösterecek boolean
      yukleniyor: true,
      // Hata durumunu saklayacak değişken
      hata: null
    };
  },

  // Bileşen DOM'a eklendikten sonra çalışacak yaşam döngüsü kancası
  mounted() {
    console.log('Bileşen DOM\'a eklendi, API çağrısı yapılıyor...');
    // API çağrısı burada yapılır
    this.fetchProducts(); // API çağrısı yapan bir metot çağırıyoruz
  },

  methods: {
    // API'den veri çekme metotu
    async fetchProducts() { // Asenkron bir metot
      this.yukleniyor = true; // Yükleniyor durumunu başlat
      this.hata = null; // Önceki hataları temizle

      try {
        // API adresiniz (örneğin kendi Flask API'nizin adresi)
        const apiUrl = 'http://127.0.0.1:5000/products';
        // API Güvenliği için başlıklar (API Key gibi) gerekiyorsa ekleyin (Konu 24)
        const headers = { 'X-API-Key': 'admin_super_key' }; // Örnek key

        // Fetch API kullanarak GET isteği gönderme
        const response = await fetch(apiUrl, { headers: headers }); // await ile Promise'i bekle

        if (!response.ok) {
           // Hata durumunda (400, 401, 403, 404, 500 vb.)
           const errorData = await response.json(); // Hata body'sini de oku
           throw new Error(`API Hatası! Status: ${response.status}, Mesaj: ${errorData.message || response.statusText}`);
        }

        // Yanıt body'sini JSON olarak oku ve Promise'i bekle
        const data = await response.json(); // await ile Promise'i bekle

        // Gelen veriyi bileşenin data'sına ata
        this.urunler = data; // Gelen data'nın doğrudan ürün listesi olduğunu varsayalım
        console.log('Ürünler başarıyla çekildi:', this.urunler);

      } catch (error) {
        console.error('API çağrısı sırasında hata oluştu:', error);
        this.hata = error; // Hata durumunu kaydet
      } finally {
        this.yukleniyor = false; // Yüklenme durumunu sonlandır
        console.log('API çağrısı tamamlandı.');
      }
    }
  },

  // ... Diğer metotlar, computed, watchers vb. buraya gelir
};
Açıklama: `data()` içinde API verisi için `urunler` ve durum takibi için `yukleniyor`, `hata` tanımladık. `mounted()` hook'unda `WorkspaceProducts` metodunu çağırdık. `WorkspaceProducts` metodu `async` olduğu için içinde `await` kullanabildik ve `Workspace` Promise'inin tamamlanmasını bekledik. Başarı durumunda `this.urunler`'i gelen veriyle güncelledik, hata durumunda `this.hata`'yı ayarladık. `this.yukleniyor` durumu çağrı başladığında `true`, bittiğinde `false` yapılır.

3. API Çağrıları İçin Seçenekler: Fetch API vs Axios[/B]

  • Fetch API: Tarayıcıda yerleşik gelir, ek kurulum gerektirmez. Promise tabanlıdır, modern ve esnektir. Raw HTTP yanıt objesi döndürür, body'yi okumak (`.json()`, `.text()`) ayrı bir asenkron adımdır. Başlıkları veya istek body'sini ayarlamak biraz daha detay gerektirir.
  • Axios: Popüler, üçüncü parti bir Promise tabanlı HTTP istemcisi kütüphanesidir (`npm install axios`). Hem tarayıcıda hem Node.js'te çalışır. Fetch'e göre bazı avantajları vardır:
    • Yanıt body'sini otomatik olarak JSON'a çevirir (genellikle).
    • Hata yönetimi genellikle daha kolaydır (status kodu 2xx olmayan yanıtlar otomatik hata fırlatır).
    • İstekleri ve yanıtları kesmek (interceptors), otomatik dönüşümler gibi ek özellikler sunar.
    • İstek body'sini göndermek (POST/PUT) Fetch'e göre biraz daha basittir.
    • Genellikle istek başlıklarını ve URL'yi ayarlamak daha kolaydır (baseURL, headers ayarları).
Vue uygulamalarında genellikle Axios tercih edilir çünkü kullanımı biraz daha pratiktir ve ek özellikler sunar.

Axios Kurulumu:
Kod:
npm install axios
# veya
yarn add axios
# veya
pnpm add axios

Axios Kullanımı (GET İsteği - Async/Await ile):

JavaScript:
import axios from 'axios'; // Axios kütüphanesini içe aktar

export default { // Bir Vue bileşeni tanımı
  data() {
    return {
      urunler: [],
      yukleniyor: true,
      hata: null
    };
  },

  mounted() {
    console.log('Bileşen DOM\'a eklendi, API çağrısı yapılıyor (Axios)...');
    this.fetchProductsWithAxios();
  },

  methods: {
    async fetchProductsWithAxios() { // Asenkron bir metot
      this.yukleniyor = true;
      this.hata = null;

      try {
        const apiUrl = 'http://127.0.0.1:5000/products';
        const apiKey = 'admin_super_key'; // API Key

        // Axios ile GET isteği gönderme (async/await)
        // headers ve diğer ayarlar config objesinde belirtilir
        const response = await axios.get(apiUrl, {
          headers: {
            'X-API-Key': apiKey // Başlıkları ekle
          },
          // baseURL: API_URL, // Axios'un varsayılan URL'sini ayarlayabilirsiniz
          // timeout: 5000, // İstek zaman aşımı (milisaniye)
        });

        // Axios yanıtı otomatik olarak JSON'a çevirir ve response.data objesine koyar
        this.urunler = response.data; // Doğrudan response.data'yı kullan
        console.log('Ürünler başarıyla çekildi (Axios):', this.urunler);

      } catch (error) { // Axios hata olursa Promise'i reject eder, burada yakalanır
        console.error('API çağrısı sırasında hata oluştu (Axios):', error);

        // Axios hata objesinden detayları alabilirsiniz
        if (error.response) { // HTTP yanıtı alındı ama status kodu 2xx değil (401, 403, 404, 500 vb.)
            console.error('Hata Yanıtı Data:', error.response.data);
            console.error('Hata Yanıtı Status:', error.response.status);
            console.error('Hata Yanıtı Headers:', error.response.headers);
            this.hata = new Error(`API Hatası! Status: ${error.response.status}, Mesaj: ${error.response.data.message || error.message}`);
        } else if (error.request) { // İstek yapıldı ama yanıt alınamadı (örn: ağ hatası)
             console.error('Hata İstek:', error.request);
             this.hata = new Error('API isteği gönderilemedi veya yanıt alınamadı.');
        } else { // Diğer hatalar (kod hatası vb.)
             console.error('Hata Mesajı:', error.message);
             this.hata = new Error('İstek oluşturulurken bir hata oluştu: ' + error.message);
        }

      } finally {
        this.yukleniyor = false;
        console.log('API çağrısı tamamlandı (Axios).');
      }
    }
  },
};
Açıklama: Axios kullanmak, Fetch'e göre biraz daha temiz bir sözdizimi sunar ve yanıtı otomatik JSON'a çevirdiği için `.json()` adımına gerek kalmaz. Hata yönetimi de genellikle `error.response` gibi alanlarla daha standarttır.

4. API Verisini Bileşenin Data'sında Saklama ve Şablonda Gösterme[/B]

API'den çekilen veri (Fetch'ten `.json()` sonrası `data`, Axios'tan `response.data`) bileşenin `data()` fonksiyonunda tanımladığınız reaktif bir değişkene (örn: `this.urunler`) atanır. Vue'nun reaktivite sistemi sayesinde, bu veri değiştiğinde, bu veriyi kullanan şablon kısımları otomatik olarak güncellenir. Bu sayede manuel DOM manipülasyonuna gerek kalmaz.

Template'te (HTML şablonunda) ise `v-if` direktifleri ile yüklenme ve hata durumlarını gösterebilir, `v-for` ile çekilen veri listesi üzerinde döngü kurarak elemanları listeleyebilirsiniz.

HTML:
<template> {# SFC template kısmı #}
  <div class="product-list-container">
    <h2>Ürün Listesi</h2>

    {# Yüklenme durumu #}
    <p v-if="yukleniyor">Ürünler yükleniyor...</p>

    {# Hata durumu #}
    <p v-else-if="hata" class="error-message">{{ hata.message }}</p>

    {# Veri başarıyla yüklendiğinde ve hata olmadığında #}
    <ul v-else-if="urunler && urunler.length > 0"> {# urunler doluysa #}
      <li v-for="urun in urunler" :key="urun.id">
        {{ urun.ad }} - {{ urun.fiyat }} TL
      </li>
    </ul>

    {# Yükleme bitti, hata yok ama ürün de yoksa #}
     <p v-else>Henüz görüntülenecek ürün bulunamadı.</p>

  </div>
</template>

<script> {# SFC script kısmı #}
// Yukarıdaki Fetch veya Axios kullanan component export default objesi buraya gelecek
// import axios from 'axios'; // Eğer axios kullanıyorsanız
// export default { data() {...}, mounted() {...}, methods: {...} };
</script>

<style scoped> {# SFC style kısmı #}
.error-message { color: red; }
/* Diğer stiller */
</style>
Açıklama: `v-if="yukleniyor"` 'yukleniyor' true iken "Yükleniyor..." mesajını gösterir. `v-else-if="hata"` yüklenme bittiğinde (yukleniyor false) ve 'hata' boş değilse hata mesajını gösterir. `v-else-if="urunler && urunler.length > 0"` ise yükleme bitti, hata yok ve urunler listesi boş değilse ürün listesini gösterir. `v-for` ile de `urunler` listesini gezerek her ürün objesinin `ad` ve `fiyat` özelliklerini şablonda gösteririz. Veri (this.urunler, this.yukleniyor, this.hata) JavaScript'te değiştiğinde, Vue bu template'i otomatik olarak günceller.

Sıra Sizde!

Vue bileşenleri içinde API çağrıları yapmak, frontend ile backend'i bağlayan en pratik adımlardan biridir.

  • Kendi Vue projenizde (Vite veya Vue CLI ile kurduysanız daha iyi olur) yeni bir bileşen oluşturun (örneğin `ProductListView.vue`).
  • Bileşeninizin `data()` kısmında API'den gelecek veriyi (örneğin `products: []`) ve durumları (`loading: true`, `error: null`) tanımlayın.
  • Bileşeninizin `mounted()` yaşam döngüsü kancasını ekleyin.
  • `mounted()` içinde, çalışan API'nize (örneğin Python Flask API'niz) bir GET isteği yapan asenkron bir metot (`async/await` kullanarak) çağırın. İster yerleşik `Workspace`'i kullanın, isterseniz `npm install axios` ile Axios'u kurup onu kullanın.
  • API isteğine, eğer API'niz güvenlik için gerektiriyorsa, `X-API-Key` gibi başlıkları ekleyin (Client-Side JavaScript ile Web API Tüketimi (Fetch API) ve Web API Güvenliği Temelleri) konularını hatırlayın.
  • API yanıtını başarıyla aldıktan sonra (`await response.json()` veya `await axios.get(...)` sonrası), gelen veriyi bileşeninizin `products` data'sına atayın. Hata olursa `error` data'sını güncelleyin. Son olarak `loading`'i `false` yapın.
  • Bileşeninizin `<template>` kısmında `v-if="loading"`, `v-else-if="hata"` ile yüklenme ve hata durumlarını gösterin. Veri geldiğinde ise `v-else-if="urunler.length > 0"` veya sadece `v-else` içinde `v-for="urun in urunler"` kullanarak ürün listesini görüntüleyin.
  • Bileşeninizi ana uygulamada veya başka bir route'ta kullanarak çalışıp çalışmadığını test edin.
`mounted()` hook'u, Fetch API vs Axios, Vue bileşeninde asenkron işlemler (`async/await`), API'den çekilen veriyi data'da saklama ve template'te gösterme veya yüklenme/hata durumu yönetimi hakkında aklınıza takılan soruları çekinmeden bu konu altında sorabilirsiniz.

Serinin Geleceği?

Vue bileşenleri içinden API çağrıları yaparak frontend ile backend'i bağlama konusunda önemli bir adım attık.

Seriyi buradan sonra nasıl devam ettirelim?

  • Vue bileşenlerinden API'ye veri gönderme (POST, PUT, DELETE) işlemleri (form verilerini alma ve API'ye gönderme)?
  • Vue Router'da daha ileri konular (Route parametreleri, Navigation Guards)?
  • Vuex veya Pinia ile Merkezi State Management (API'den çekilen veya uygulamada paylaşılan verileri bileşenler arası yönetme)?
  • Daha ileri Veri Yapıları ve Algoritma konuları?
  • Başka bir programlama diline giriş (C#, C++ gibi)?
  • Veya başka önerileriniz mi var?
Geri bildirimleriniz ve önerileriniz serinin geleceğini şekillendirecektir.

Umarım bu konu, dinamik ve veri odaklı web arayüzleri geliştirmeye başlarken faydalı olmuştur. Görüşmek üzere!



Bu konu, "Hazır Kod Bankası" serisinin otuzuncu parçasıdır ve "Yazılım Bilgi ve Yeni Başlayanlar İçin" kategorisi altında paylaşılmıştır.
 

Şu an konuyu görüntüleyenler

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz

Zevkini yansıtan rengi seç

Geniş / Dar görünüm

Temanızı geniş yada dar olarak kullanmak için kullanabileceğiniz bir yapıyı kontrolünü sağlayabilirsiniz.

Izgara görünümlü forum listesi

Forum listesindeki düzeni ızgara yada sıradan listeleme tarzındaki yapının kontrolünü sağlayabilirsiniz.

Resimli ızgara modu

Izgara forum listesinde resimleri açıp/kapatabileceğiniz yapının kontrolünü sağlayabilirsiniz.

Kenar çubuğunu kapat

Kenar çubuğunu kapatarak forumdaki kalabalık görünümde kurtulabilirsiniz.

Sabit kenar çubuğu

Kenar çubuğunu sabitleyerek daha kullanışlı ve erişiminizi kolaylaştırabilirsiniz.

Köşe kıvrımlarını kapat

Blokların köşelerinde bulunan kıvrımları kapatıp/açarak zevkinize göre kullanabilirsiniz.

Geri