- 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
};
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ı).
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).');
}
}
},
};
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>
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.
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?
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.