# Bankacılık Uygulaması Geliştirme Bölüm 3: Verileri Alma ve Kullanma Yöntemleri Star Trek'teki Enterprise'ın bilgisayarını düşünün - Kaptan Picard geminin durumunu sorduğunda, bilgi anında görünür ve tüm arayüz kapanıp yeniden inşa edilmez. İşte burada, dinamik veri alma ile bu kesintisiz bilgi akışını oluşturuyoruz. Şu anda bankacılık uygulamanız basılı bir gazete gibi - bilgilendirici ama statik. Bunu NASA'nın görev kontrol merkezi gibi bir şeye dönüştüreceğiz; burada veriler sürekli akar ve gerçek zamanlı olarak güncellenir, kullanıcıların iş akışını kesintiye uğratmadan. Sunucularla asenkron olarak nasıl iletişim kuracağınızı, farklı zamanlarda gelen verileri nasıl yöneteceğinizi ve ham bilgileri kullanıcılarınız için anlamlı bir şeye nasıl dönüştüreceğinizi öğreneceksiniz. Bu, bir demo ile üretime hazır bir yazılım arasındaki farktır. ## ⚡ Sonraki 5 Dakikada Yapabilecekleriniz **Yoğun Geliştiriciler için Hızlı Başlangıç Yolu** ```mermaid flowchart LR A[⚡ 5 minutes] --> B[Set up API server] B --> C[Test fetch with curl] C --> D[Create login function] D --> E[See data in action] ``` - **Dakika 1-2**: API sunucunuzu başlatın (`cd api && npm start`) ve bağlantıyı test edin - **Dakika 3**: `getAccount()` adlı temel bir işlev oluşturun ve fetch kullanın - **Dakika 4**: Giriş formunu `action="javascript:login()"` ile bağlayın - **Dakika 5**: Girişi test edin ve hesap verilerinin konsolda göründüğünü izleyin **Hızlı Test Komutları**: ```bash # Verify API is running curl http://localhost:5000/api # Test account data fetch curl http://localhost:5000/api/accounts/test ``` **Neden Önemli**: 5 dakika içinde, modern web uygulamalarını canlı ve duyarlı hissettiren asenkron veri almanın büyüsünü göreceksiniz. Bu, uygulamaları profesyonel ve kullanıcı dostu yapan temeldir. ## 🗺️ Veri Odaklı Web Uygulamaları Öğrenme Yolculuğunuz ```mermaid journey title From Static Pages to Dynamic Applications section Understanding the Evolution Traditional page reloads: 3: You Discover AJAX/SPA benefits: 5: You Master Fetch API patterns: 7: You section Building Authentication Create login functions: 4: You Handle async operations: 6: You Manage user sessions: 8: You section Dynamic UI Updates Learn DOM manipulation: 5: You Build transaction displays: 7: You Create responsive dashboards: 9: You section Professional Patterns Template-based rendering: 6: You Error handling strategies: 7: You Performance optimization: 8: You ``` **Hedefiniz**: Bu dersin sonunda, modern web uygulamalarının verileri nasıl aldığını, işlediğini ve dinamik olarak görüntülediğini anlayacaksınız. Bu, profesyonel uygulamalardan beklediğimiz kesintisiz kullanıcı deneyimlerini yaratır. ## Ön Ders Testi [Ön ders testi](https://ff-quizzes.netlify.app/web/quiz/45) ### Ön Koşullar Veri alma işlemine başlamadan önce, şu bileşenlerin hazır olduğundan emin olun: - **Önceki Ders**: [Giriş ve Kayıt Formu](../2-forms/README.md) dersini tamamlayın - bu temelin üzerine inşa edeceğiz - **Yerel Sunucu**: [Node.js](https://nodejs.org) yükleyin ve [sunucu API'sini çalıştırın](../api/README.md) hesap verilerini sağlamak için - **API Bağlantısı**: Sunucu bağlantınızı şu komutla test edin: ```bash curl http://localhost:5000/api # Expected response: "Bank API v1.0.0" ``` Bu hızlı test, tüm bileşenlerin düzgün iletişim kurduğunu doğrular: - Node.js'in sisteminizde doğru çalıştığını doğrular - API sunucunuzun aktif ve yanıt verdiğini onaylar - Uygulamanızın sunucuya ulaşabildiğini doğrular (bir görev öncesi radyo iletişimini kontrol etmek gibi) ## 🧠 Veri Yönetimi Ekosistemi Genel Bakış ```mermaid mindmap root((Data Management)) Authentication Flow Login Process Form Validation Credential Verification Session Management User State Global Account Object Navigation Guards Error Handling API Communication Fetch Patterns GET Requests POST Requests Error Responses Data Formats JSON Processing URL Encoding Response Parsing Dynamic UI Updates DOM Manipulation Safe Text Updates Element Creation Template Cloning User Experience Real-time Updates Error Messages Loading States Security Considerations XSS Prevention textContent Usage Input Sanitization Safe HTML Creation CORS Handling Cross-Origin Requests Header Configuration Development Setup ``` **Temel İlke**: Modern web uygulamaları, kullanıcı arayüzleri, sunucu API'leri ve tarayıcı güvenlik modelleri arasında koordinasyon sağlayan veri orkestrasyon sistemleridir. Bu, kesintisiz ve duyarlı deneyimler yaratır. --- ## Modern Web Uygulamalarında Veri Alma Sürecini Anlamak Web uygulamalarının verileri işleme şekli son yirmi yılda dramatik bir şekilde değişti. Bu evrimi anlamak, modern tekniklerin neden bu kadar güçlü olduğunu ve neden web geliştiricileri için vazgeçilmez araçlar haline geldiğini anlamanıza yardımcı olacaktır. Geleneksel web sitelerinin nasıl çalıştığını, bugün oluşturduğumuz dinamik ve duyarlı uygulamalarla karşılaştırarak inceleyelim. ### Geleneksel Çoklu Sayfa Uygulamaları (MPA) Web'in ilk günlerinde, her tıklama eski bir televizyon kanalını değiştirmek gibiydi - ekran boşalır, ardından yeni içerik yavaşça yüklenirdi. Bu, her etkileşimin tüm sayfayı baştan sona yeniden inşa etmek anlamına geldiği erken web uygulamalarının gerçekliğiydi. ```mermaid sequenceDiagram participant User participant Browser participant Server User->>Browser: Clicks link or submits form Browser->>Server: Requests new HTML page Note over Browser: Page goes blank Server->>Browser: Returns complete HTML page Browser->>User: Displays new page (flash/reload) ``` ![Çoklu sayfa uygulamasında güncelleme iş akışı](../../../../translated_images/mpa.7f7375a1a2d4aa779d3f928a2aaaf9ad76bcdeb05cfce2dc27ab126024050f51.tr.png) **Bu yaklaşım neden hantal hissettiriyordu:** - Her tıklama tüm sayfanın baştan sona yeniden inşa edilmesi anlamına geliyordu - Kullanıcılar, bu rahatsız edici sayfa yanıp sönmeleriyle düşüncelerinin ortasında kesintiye uğruyordu - İnternet bağlantınız aynı başlık ve altbilgiyi tekrar tekrar indirerek fazla çalışıyordu - Uygulamalar, bir dosya dolabında gezinmekten çok yazılım kullanmak gibi hissettiriyordu ### Modern Tek Sayfa Uygulamaları (SPA) AJAX (Asenkron JavaScript ve XML) bu paradigmayı tamamen değiştirdi. Uluslararası Uzay İstasyonu'nun modüler tasarımı gibi, astronotlar tüm yapıyı yeniden inşa etmek zorunda kalmadan bireysel bileşenleri değiştirebilirler. AJAX, bir web sayfasının belirli bölümlerini yeniden yüklemeden güncellememize olanak tanır. İsmi XML'den bahsetse de, bugün çoğunlukla JSON kullanıyoruz, ancak temel ilke aynı: yalnızca değişmesi gerekeni güncellemek. ```mermaid sequenceDiagram participant User participant Browser participant JavaScript participant Server User->>Browser: Interacts with page Browser->>JavaScript: Triggers event handler JavaScript->>Server: Fetches only needed data Server->>JavaScript: Returns JSON data JavaScript->>Browser: Updates specific page elements Browser->>User: Shows updated content (no reload) ``` ![Tek sayfa uygulamasında güncelleme iş akışı](../../../../translated_images/spa.268ec73b41f992c2a21ef9294235c6ae597b3c37e2c03f0494c2d8857325cc57.tr.png) **SPA'lar neden daha iyi hissettiriyor:** - Sadece gerçekten değişen bölümler güncellenir (akıllıca, değil mi?) - Artık rahatsız edici kesintiler yok - kullanıcılar akışlarında kalır - Daha az veri aktarımı daha hızlı yükleme anlamına gelir - Her şey telefonunuzdaki uygulamalar gibi hızlı ve duyarlı hissedilir ### Modern Fetch API'ye Evrim Modern tarayıcılar, eski [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) yerine [`Fetch` API'sini](https://developer.mozilla.org/docs/Web/API/Fetch_API) sağlar. Telgraf kullanmak ile e-posta göndermek arasındaki fark gibi, Fetch API, temiz asenkron kod için sözler kullanır ve JSON'u doğal olarak işler. | Özellik | XMLHttpRequest | Fetch API | |---------|----------------|----------| | **Sözdizimi** | Karmaşık geri çağrı tabanlı | Temiz söz tabanlı | | **JSON İşleme** | Manuel ayrıştırma gerekli | Dahili `.json()` yöntemi | | **Hata Yönetimi** | Sınırlı hata bilgisi | Kapsamlı hata detayları | | **Modern Destek** | Eski uyumluluk | ES6+ sözler ve async/await | > 💡 **Tarayıcı Uyumluluğu**: İyi haber - Fetch API tüm modern tarayıcılarda çalışır! Belirli sürümler hakkında merak ediyorsanız, [caniuse.com](https://caniuse.com/fetch) tam uyumluluk hikayesini sunar. > **Sonuç:** - Chrome, Firefox, Safari ve Edge'de harika çalışır (temelde kullanıcılarınızın olduğu her yerde) - Sadece Internet Explorer ek yardıma ihtiyaç duyar (ve dürüst olmak gerekirse, IE'yi bırakmanın zamanı geldi) - Daha sonra kullanacağımız zarif async/await desenleri için sizi mükemmel bir şekilde hazırlar ### Kullanıcı Girişi ve Veri Alma İşlemini Uygulama Şimdi bankacılık uygulamanızı statik bir ekrandan işlevsel bir uygulamaya dönüştüren giriş sistemini uygulayalım. Güvenli askeri tesislerde kullanılan kimlik doğrulama protokolleri gibi, kullanıcı kimlik bilgilerini doğrulayacağız ve ardından belirli verilerine erişim sağlayacağız. Bunu temel kimlik doğrulama ile başlayarak ve ardından veri alma yeteneklerini ekleyerek kademeli olarak oluşturacağız. #### Adım 1: Giriş Fonksiyonu Temeli Oluşturma `app.js` dosyanızı açın ve yeni bir `login` fonksiyonu ekleyin. Bu, kullanıcı kimlik doğrulama sürecini yönetecek: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **Bunu açıklayalım:** - `async` anahtar kelimesi, JavaScript'e "hey, bu işlevin bazı şeyler için beklemesi gerekebilir" diyor - Sayfadan formumuzu alıyoruz (sadece ID'sine göre buluyoruz) - Ardından, kullanıcının kullanıcı adı olarak yazdığı şeyi alıyoruz - İşte güzel bir numara: Herhangi bir form girdisine `name` özelliğiyle erişebilirsiniz - ekstra getElementById çağrılarına gerek yok! > 💡 **Form Erişim Deseni**: Her form kontrolüne, HTML'de `name` özelliği kullanılarak form öğesinin bir özelliği olarak erişilebilir. Bu, form verilerini almak için temiz ve okunabilir bir yol sağlar. #### Adım 2: Hesap Verilerini Alma Fonksiyonu Oluşturma Sonraki adımda, sunucudan hesap verilerini almak için özel bir işlev oluşturacağız. Bu, kayıt işlevinizle aynı deseni takip eder ancak veri alımına odaklanır: ```javascript async function getAccount(user) { try { const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user)); return await response.json(); } catch (error) { return { error: error.message || 'Unknown error' }; } } ``` **Bu kodun başardıkları:** - Modern `fetch` API'sini kullanarak verileri asenkron olarak talep eder - Kullanıcı adı parametresiyle bir GET isteği URL'si oluşturur - URL'deki özel karakterleri güvenli bir şekilde işlemek için `encodeURIComponent()` uygular - Yanıtı JSON formatına dönüştürür ve verileri kolayca işler - Hataları zarif bir şekilde ele alır ve çökme yerine bir hata nesnesi döndürür > ⚠️ **Güvenlik Notu**: `encodeURIComponent()` işlevi, URL'lerdeki özel karakterleri işler. Denizcilik iletişim sistemlerinde kullanılan kodlama sistemleri gibi, mesajınızın tam olarak amaçlandığı şekilde ulaşmasını sağlar ve "#" veya "&" gibi karakterlerin yanlış yorumlanmasını önler. > **Neden önemli:** - Özel karakterlerin URL'leri bozmasını önler - URL manipülasyon saldırılarına karşı korur - Sunucunuzun amaçlanan verileri almasını sağlar - Güvenli kodlama uygulamalarını takip eder #### HTTP GET İsteklerini Anlamak Şaşırtıcı gelebilir: `fetch`i herhangi bir ek seçenek olmadan kullandığınızda, otomatik olarak bir [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) isteği oluşturur. Bu, "hey, bu kullanıcının hesap verilerini görebilir miyim?" diye sunucuya sormak için mükemmeldir. GET isteklerini bir kütüphaneden ödünç kitap istemek gibi düşünün - zaten var olan bir şeyi görmek istiyorsunuz. POST istekleri (kayıt için kullandığımız) ise koleksiyona eklenmesi için yeni bir kitap göndermek gibidir. | GET İsteği | POST İsteği | |------------|-------------| | **Amaç** | Mevcut verileri almak | Sunucuya yeni veri göndermek | | **Parametreler** | URL yolu/sorgu dizesinde | İstek gövdesinde | | **Önbellekleme** | Tarayıcılar tarafından önbelleğe alınabilir | Genellikle önbelleğe alınmaz | | **Güvenlik** | URL/günlüklerde görünür | İstek gövdesinde gizli | ```mermaid sequenceDiagram participant B as Browser participant S as Server Note over B,S: GET Request (Data Retrieval) B->>S: GET /api/accounts/test S-->>B: 200 OK + Account Data Note over B,S: POST Request (Data Submission) B->>S: POST /api/accounts + New Account Data S-->>B: 201 Created + Confirmation Note over B,S: Error Handling B->>S: GET /api/accounts/nonexistent S-->>B: 404 Not Found + Error Message ``` #### Adım 3: Her Şeyi Bir Araya Getirme Şimdi tatmin edici kısma geldik - hesap alma işlevinizi giriş sürecine bağlayalım. İşte her şeyin yerine oturduğu yer: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; const data = await getAccount(user); if (data.error) { return console.log('loginError', data.error); } account = data; navigate('/dashboard'); } ``` Bu işlev açık bir sırayı takip eder: - Form girişinden kullanıcı adını çıkarır - Sunucudan kullanıcının hesap verilerini talep eder - İşlem sırasında meydana gelen hataları ele alır - Hesap verilerini saklar ve başarı durumunda kontrol paneline yönlendirir > 🎯 **Async/Await Deseni**: `getAccount` asenkron bir işlev olduğundan, kodun sunucudan yanıt alana kadar duraklaması için `await` anahtar kelimesini kullanıyoruz. Bu, kodun tanımsız verilerle devam etmesini önler. #### Adım 4: Verileriniz İçin Bir Alan Oluşturma Uygulamanız, yüklendikten sonra hesap bilgilerini hatırlayacak bir yere ihtiyaç duyar. Bunu uygulamanızın kısa süreli belleği gibi düşünün - mevcut kullanıcının verilerini elinizin altında tutmak için bir yer. `app.js` dosyanızın en üstüne şu satırı ekleyin: ```javascript // This holds the current user's account data let account = null; ``` **Neden buna ihtiyacımız var:** - Hesap verilerini uygulamanızın herhangi bir yerinden erişilebilir tutar - `null` ile başlamak "henüz kimse giriş yapmadı" anlamına gelir - Birisi başarıyla giriş yaptığında veya kaydolduğunda güncellenir - Tek bir doğru kaynak gibi davranır - kimin giriş yaptığını anlamada karışıklık olmaz #### Adım 5: Formunuzu Bağlayın Şimdi yeni giriş işlevinizi HTML formunuza bağlayalım. Form etiketinizi şu şekilde güncelleyin: ```html
``` **Bu küçük değişiklik ne yapar:** - Formun varsayılan "tüm sayfayı yeniden yükleme" davranışını durdurur - Bunun yerine özel JavaScript işlevinizi çağırır - Her şeyi sorunsuz ve tek sayfa uygulaması gibi tutar - Kullanıcılar "Giriş Yap" düğmesine bastığında ne olacağı üzerinde tam kontrol sağlar #### Adım 6: Kayıt Fonksiyonunuzu Geliştirin Tutarlılık için, kayıt fonksiyonunuzu da hesap verilerini saklayacak ve kontrol paneline yönlendirecek şekilde güncelleyin: ```javascript // Add these lines at the end of your register function account = result; navigate('/dashboard'); ``` **Bu geliştirme şunları sağlar:** - **Kesintisiz** bir geçiş sağlar: kayıttan kontrol paneline - **Tutarlı** bir kullanıcı deneyimi sunar: giriş ve kayıt akışları arasında - **Anında** erişim sağlar: başarılı bir kayıttan sonra hesap verilerine #### Uygulamanızı Test Etme ```mermaid flowchart TD A[User enters credentials] --> B[Login function called] B --> C[Fetch account data from server] C --> D{Data received successfully?} D -->|Yes| E[Store account data globally] D -->|No| F[Display error message] E --> G[Navigate to dashboard] F --> H[User stays on login page] ``` **Şimdi bir deneme yapma zamanı:** 1. Her şeyin çalıştığından emin olmak için yeni bir hesap oluşturun 2. Aynı kimlik bilgileriyle giriş yapmayı deneyin 3. Bir şeyler ters gidiyorsa tarayıcınızın konsoluna (F12) göz atın 4. Başarılı bir girişten sonra kontrol paneline ulaştığınızdan emin olun Bir şeyler çalışmıyorsa, panik yapmayın! Çoğu sorun, yazım hataları veya API sunucusunu başlatmayı unutmak gibi basit düzeltmelerdir. #### Farklı Köken Sihri Hakkında Kısa Bir Not Şunu merak ediyor olabilirsiniz: "Web uygulamam bu API sunucusuyla farklı portlarda çalışırken nasıl iletişim kuruyor?" Harika bir soru! Bu, her web geliştiricisinin eninde sonunda karşılaştığı bir konudur. > 🔒 **Farklı Köken Güvenliği**: Tarayıcılar, farklı alanlar arasında yetkisiz iletişimi önlemek için "aynı köken politikası" uygular. Pentagon'daki kontrol noktası sistemi gibi, veri aktarımına izin vermeden önce iletişimin yetkilendirildiğini doğrular. > **Bizim kurulumumuzda:** - Web uygulamanız `localhost:3000` üzerinde çalışıyor (geliştirme sunucusu) - API sunucunuz `localhost:5000` üzerinde çalışıyor (arka uç sunucusu) - API sunucusu, [CORS başlıkları](https://developer.mozilla.org/docs/Web/HTTP/CORS) içerir ve web uygulamanızdan iletişimi açıkça yetkilendirir Bu yapılandırma, genellikle ön uç ve arka uç uygulamalarının ayrı sunucularda çalıştığı gerçek dünya geliştirme ortamını yansıtır. > 📚 **Daha Fazla Bilgi Edinin**: API'ler ve veri alma hakkında daha fazla bilgi edinmek için bu kapsamlı [Microsoft Learn modülüne](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon) göz atın. ## Verilerinizi HTML'de Hayata Geçirme Şimdi alınan verileri, kullanıcıların görebileceği ve etkileşimde bulunabileceği şekilde DOM manipülasyonu ile görselleştireceğiz. Bir karanlık odada fotoğraf geliştirme süreci gibi, görünmez verileri alıp kullanıcıların görebileceği ve etkileşimde bulunabileceği bir şeye dönüştüreceğiz. DOM manipülasyonu, statik web sayfalarını kullanıcı etkileşimleri ve sunucu yanıtlarına göre içeriklerini güncelleyen dinamik uygulamalara dönüştüren bir tekniktir. ### İş İçin Doğru Aracı Seçmek HTML'inizi JavaScript ile güncellemek söz konusu olduğunda, birkaç seçeneğiniz var. Bunları bir alet çantasında farklı araçlar gibi düşünün - her biri belirli işler için mükemmel: | Yöntem | Harika olduğu alan | Ne zaman kullanılır | Güvenlik seviyesi | |--------|---------------------|--------------------|-------------------| | `textContent` | Kullanıcı verilerini güvenli bir şekilde göstermek | Metin gösterdiğiniz her zaman | ✅ Çok güvenli | | `createElement()` + `append()` | Karmaşık düzenler oluşturmak | Yeni bölümler/listeler oluşturmak | ✅ Çok güvenli | | `innerHTML` | HTML içeriği ayarlamak | ⚠️ Bundan kaçınmaya çalışın | ❌ Riskli iş | #### Metni Güvenli Bir Şekilde Gösterme: textContent [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) özelliği, kullanıcı verilerini gösterirken en iyi dostunuzdur. Bu, web sayfanız için bir güvenlik görevlisi gibidir - zararlı hiçbir şey geçemez: ```javascript // The safe, reliable way to update text const balanceElement = document.getElementById('balance'); balanceElement.textContent = account.balance; ``` **textContent'in Faydaları:** - Her şeyi düz metin olarak işler (script çalıştırmayı önler) - Mevcut içeriği otomatik olarak temizler - Basit metin güncellemeleri için verimli - Zararlı içeriklere karşı yerleşik güvenlik sağlar #### Dinamik HTML Elemanları Oluşturma Daha karmaşık içerikler için [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) ile [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) yöntemini birleştirin: ```javascript // Safe way to create new elements const transactionItem = document.createElement('div'); transactionItem.className = 'transaction-item'; transactionItem.textContent = `${transaction.date}: ${transaction.description}`; container.append(transactionItem); ``` **Bu yaklaşımı anlamak:** - **Yeni** DOM elemanlarını programlı olarak oluşturur - **Eleman** özellikleri ve içerik üzerinde tam kontrol sağlar - **Karmaşık**, iç içe geçmiş eleman yapıları oluşturmanıza olanak tanır - **Güvenliği** korur, yapıyı içerikten ayırır > ⚠️ **Güvenlik Düşüncesi**: [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) birçok öğreticide yer alsa da, gömülü scriptleri çalıştırabilir. CERN'deki güvenlik protokolleri gibi, yetkisiz kod çalıştırmayı önler. `textContent` ve `createElement` kullanımı daha güvenli alternatifler sunar. > **innerHTML'nin Riskleri:** - Kullanıcı verisindeki `