# Bir Bankacılık Uygulaması Geliştirme Bölüm 3: Verileri Getirme ve Kullanma Yöntemleri ## Ders Öncesi Test [Ders öncesi testi](https://ff-quizzes.netlify.app/web/quiz/45) ### Giriş Her web uygulamasının temelinde *veri* bulunur. Veriler birçok biçimde olabilir, ancak temel amacı her zaman kullanıcıya bilgi sunmaktır. Web uygulamaları giderek daha etkileşimli ve karmaşık hale geldikçe, kullanıcının bilgiye nasıl eriştiği ve bu bilgilerle nasıl etkileşimde bulunduğu, web geliştirme sürecinin önemli bir parçası haline gelmiştir. Bu derste, bir sunucudan verileri eşzamansız olarak nasıl getireceğimizi ve bu verileri HTML'yi yeniden yüklemeden bir web sayfasında nasıl görüntüleyeceğimizi göreceğiz. ### Ön Koşul Bu ders için web uygulamasının [Giriş ve Kayıt Formu](../2-forms/README.md) bölümünü oluşturmuş olmanız gerekiyor. Ayrıca [Node.js](https://nodejs.org) kurmalı ve [sunucu API'sini](../api/README.md) yerel olarak çalıştırmalısınız, böylece hesap verilerini alabilirsiniz. Sunucunun düzgün çalıştığını test etmek için bir terminalde şu komutu çalıştırabilirsiniz: ```sh curl http://localhost:5000/api # -> should return "Bank API v1.0.0" as a result ``` --- ## AJAX ve Veri Getirme Geleneksel web siteleri, kullanıcı bir bağlantıyı seçtiğinde veya bir form aracılığıyla veri gönderdiğinde, tam HTML sayfasını yeniden yükleyerek görüntülenen içeriği günceller. Yeni veriler yüklendiğinde, web sunucusu tarayıcı tarafından işlenmesi gereken tamamen yeni bir HTML sayfası döndürür. Bu işlem, mevcut kullanıcı eylemini kesintiye uğratır ve yeniden yükleme sırasında etkileşimleri sınırlar. Bu iş akışı, *Çok Sayfalı Uygulama* veya *MPA* olarak adlandırılır.  Web uygulamaları daha karmaşık ve etkileşimli hale gelmeye başladığında, [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) adı verilen yeni bir teknik ortaya çıktı. Bu teknik, web uygulamalarının JavaScript kullanarak sunucudan eşzamansız olarak veri göndermesine ve almasına olanak tanır; bu da HTML sayfasını yeniden yüklemeye gerek kalmadan daha hızlı güncellemeler ve daha akıcı kullanıcı etkileşimleri sağlar. Sunucudan yeni veriler alındığında, mevcut HTML sayfası [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API'si kullanılarak JavaScript ile güncellenebilir. Zamanla, bu yaklaşım [*Tek Sayfalı Uygulama* veya *SPA*](https://en.wikipedia.org/wiki/Single-page_application) olarak adlandırılan bir yapıya evrilmiştir.  AJAX ilk tanıtıldığında, verileri eşzamansız olarak getirmek için mevcut olan tek API [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) idi. Ancak modern tarayıcılar artık daha kullanışlı ve güçlü olan [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API)'sini de desteklemektedir. Bu API, sözler (promises) kullanır ve JSON verilerini işlemek için daha uygundur. > Modern tarayıcıların tümü `Fetch API`'yi desteklese de, web uygulamanızın eski veya eski tarayıcılarda çalışmasını istiyorsanız, önce [caniuse.com'daki uyumluluk tablosunu](https://caniuse.com/fetch) kontrol etmek her zaman iyi bir fikirdir. ### Görev [Önceki derste](../2-forms/README.md) bir hesap oluşturmak için kayıt formunu uygulamıştık. Şimdi mevcut bir hesapla giriş yapmak ve verilerini getirmek için kod ekleyeceğiz. `app.js` dosyasını açın ve yeni bir `login` fonksiyonu ekleyin: ```js async function login() { const loginForm = document.getElementById('loginForm') const user = loginForm.user.value; } ``` Burada, `getElementById()` ile form öğesini alarak başlıyoruz ve ardından `loginForm.user.value` ile giriş formundaki kullanıcı adını alıyoruz. Her form kontrolüne, formun bir özelliği olarak (HTML'de `name` özelliği kullanılarak ayarlanır) adıyla erişilebilir. Kayıt işlemi için yaptığımız gibi, bu sefer hesap verilerini almak için bir sunucu isteği gerçekleştiren başka bir fonksiyon oluşturacağız: ```js 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' }; } } ``` `fetch` API'sini kullanarak sunucudan verileri eşzamansız olarak talep ediyoruz, ancak bu sefer yalnızca veri sorguladığımız için URL dışında başka bir parametreye ihtiyacımız yok. Varsayılan olarak, `fetch` bir [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP isteği oluşturur ve bu bizim burada istediğimiz şeydir. ✅ `encodeURIComponent()` özel karakterleri URL için kaçış karakterine dönüştüren bir fonksiyondur. Bu fonksiyonu çağırmaz ve `user` değerini doğrudan URL'de kullanırsak ne gibi sorunlarla karşılaşabiliriz? Şimdi `login` fonksiyonumuzu `getAccount` fonksiyonunu kullanacak şekilde güncelleyelim: ```js 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'); } ``` Öncelikle, `getAccount` eşzamansız bir fonksiyon olduğu için, sunucu sonucunu beklemek için `await` anahtar kelimesini kullanmamız gerekiyor. Herhangi bir sunucu isteğinde olduğu gibi, hata durumlarıyla da başa çıkmamız gerekiyor. Şimdilik yalnızca bir log mesajı ekleyerek hatayı göstereceğiz ve buna daha sonra geri döneceğiz. Daha sonra, verileri daha sonra gösterge tablosu bilgilerini görüntülemek için kullanabilmek adına bir yerde saklamamız gerekiyor. `account` değişkeni henüz mevcut olmadığından, dosyamızın en üstünde bir global değişken oluşturacağız: ```js let account = null; ``` Kullanıcı verileri bir değişkene kaydedildikten sonra, *giriş* sayfasından *gösterge tablosu* sayfasına `navigate()` fonksiyonunu kullanarak geçiş yapabiliriz. Son olarak, giriş formu gönderildiğinde `login` fonksiyonumuzu çağırmamız gerekiyor. Bunun için HTML'yi şu şekilde değiştirelim: ```html