# 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, bilgiler anında ekranda belirir ve tüm arayüz kapanıp yeniden yüklenmez. İşte burada, dinamik veri alma ile tam olarak 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 olarak akar ve kullanıcıların iş akışını kesintiye uğratmadan gerçek zamanlı olarak güncellenir. 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 yazılım arasındaki farktır. ## Ders Öncesi Test [Ders öncesi test](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 bir şekilde 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örevden önce radyo iletişimini kontrol etmek gibi). --- ## Modern Web Uygulamalarında Veri Alma İşlemini Anlama Web uygulamalarının veri işleme şekli son yirmi yılda dramatik bir şekilde değişti. Bu evrimi anlamak, neden modern tekniklerin (AJAX ve Fetch API gibi) 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 Çok Sayfalı 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 sayfanın baştan sona yeniden oluşturulması 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) ``` ![Çok sayfalı bir uygulamada 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 oluşturulması 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 mesai yapıyordu. - Uygulamalar, bir dosya dolabında gezinmek gibi hissediliyordu, yazılım kullanmak gibi değil. ### 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ın tüm yapıyı yeniden inşa etmeden bireysel bileşenleri değiştirebilmesi gibi, 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üncelleyin. ```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 kablo üzerinden taşınır, bu da daha hızlı yükleme sağlar. - 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](https://developer.mozilla.org/docs/Web/API/Fetch_API) sağlar. Telgraf kullanmak ile e-posta kullanmak 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 ekstra 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 Temelini Oluşturma `app.js` dosyanızı açın ve yeni bir `login` fonksiyonu ekleyin. Bu, kullanıcı kimlik doğrulama işlemini yönetecek: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **Bunu parçalayalım:** - `async` anahtar kelimesi, JavaScript'e "hey, bu fonksiyonun beklemesi gerekebilir" diyor. - Sayfadaki formu 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 ayarlanan bir form elemanının ö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 fonksiyon oluşturacağız. Bu, kayıt fonksiyonunuzla 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'yi 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, böylece veriler kolayca işlenebilir. - Hataları zarif bir şekilde yönetir ve çökme yerine bir hata nesnesi döndürür. > ⚠️ **Güvenlik Notu**: `encodeURIComponent()` fonksiyonu, URL'lerdeki özel karakterleri işler. Denizcilik iletişimlerinde 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 Anlama Şaşırtıcı bir şey: `fetch` ekstra seçenekler olmadan kullanıldığında, otomatik olarak bir [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) isteği oluşturur. Bu, yaptığımız şey için mükemmel - sunucuya "hey, bu kullanıcının hesap verilerini görebilir miyim?" diye sormak. GET isteklerini bir kütüphaneden ödünç almak gibi düşünün - zaten var olan bir şeyi görmeyi talep ediyorsunuz. Kayıt için kullandığımız POST istekleri ise daha çok 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 yolunda/sorgu dizesinde | İstek gövdesinde | | **Önbellekleme** | Tarayıcılar tarafından önbelleğe alınabilir | Genellikle önbelleğe alınmaz | | **Güvenlik** | URL'de/günlüklerde görünür | İstek gövdesinde gizli | #### Adım 3: Her Şeyi Bir Araya Getirme Şimdi tatmin edici kısım - hesap alma fonksiyonunuzu 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 fonksiyon 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ı yönetir. - Hesap verilerini saklar ve başarı durumunda kontrol paneline yönlendirir. > 🎯 **Async/Await Deseni**: `getAccount` asenkron bir fonksiyon olduğundan, sunucunun yanıt vermesini beklemek 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ığı konusunda kafa karışıklığı olmaz. #### Adım 5: Formunuzu Bağlayın Şimdi yeni giriş fonksiyonunuzu 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ükle" davranışını durdurur. - Bunun yerine özel JavaScript fonksiyonunuzu ç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, `register` 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:** - **Sorunsuz** 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** hesap verilerine erişim sağlar, başarılı bir kayıttan sonra. #### 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 giderse 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. #### Çapraz Kaynak Sihri Hakkında Kısa Bir Not 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 konu. > 🔒 **Çapraz Kaynak Güvenliği**: Tarayıcılar, farklı alanlar arasında yetkisiz iletişimi önlemek için "aynı kaynak 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, web uygulamanızdan iletişimi açıkça yetkilendiren [CORS başlıkları](https://developer.mozilla.org/docs/Web/HTTP/CORS) içerir. Bu yapılandırma, ön uç ve arka uç uygulamalarının genellikle ayrı sunucularda çalıştığı gerçek dünya geliştirme ortamını yansıtır. > 📚 **Daha Fazla Bilgi Edinin**: API'ler ve veri alma işlemleri 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 aracılığıyla görselleştireceğiz. Tıpkı bir karanlık odada fotoğrafları 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ürüyoruz. DOM manipülasyonu, statik web sayfalarını kullanıcı etkileşimlerine ve sunucu yanıtlarına dayalı olarak içeriklerini güncelleyen dinamik uygulamalara dönüştüren 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 şey | Ne zaman kullanılır | Güvenlik seviyesi | |--------|---------------------|----------------|--------------| | `textContent` | Kullanıcı verilerini güvenli bir şekilde göstermek | Herhangi bir zamanda metin gösterirken | ✅ Sağlam | | `createElement()` + `append()` | Karmaşık düzenler oluşturmak | Yeni bölümler/listeler oluşturmak | ✅ Güvenilir | | `innerHTML` | HTML içeriği ayarlamak | ⚠️ Bunu kullanmaktan kaçının | ❌ Riskli işler | #### 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 arkadaşınızdır. Web sayfanız için bir güvenlik görevlisi gibi - 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 (komut dosyası çalıştırılmasını ö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) yöntemini [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) yöntemiyle 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 öğelerini programlı olarak oluşturur - **Öğelerin** özellikleri ve içeriği üzerinde tam kontrol sağlar - **Karmaşık** ve iç içe geçmiş öğe yapıları oluşturmanıza olanak tanır - **Güvenliği** korur, yapıyı içerikten ayırır > ⚠️ **Güvenlik Dikkati**: [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) birçok öğreticide yer alsa da, gömülü komut dosyalarını çalıştırabilir. CERN'deki yetkisiz kod çalıştırmayı önleyen güvenlik protokolleri gibi, `textContent` ve `createElement` kullanımı daha güvenli alternatifler sunar. > **innerHTML'nin riskleri:** - Kullanıcı verilerindeki `