# बँकिंग अॅप तयार करा भाग ३: डेटा मिळवण्याचे आणि वापरण्याचे पद्धती ## प्री-लेक्चर क्विझ [प्री-लेक्चर क्विझ](https://ff-quizzes.netlify.app/web/quiz/45) ### परिचय प्रत्येक वेब अॅप्लिकेशनच्या केंद्रस्थानी *डेटा* असतो. डेटा विविध स्वरूपात असतो, परंतु त्याचा मुख्य उद्देश नेहमीच वापरकर्त्याला माहिती दाखवणे असतो. वेब अॅप्स अधिकाधिक परस्परसंवादी आणि जटिल होत असल्याने, वापरकर्ता माहिती कशी मिळवतो आणि तिचा कसा उपयोग करतो, हे वेब विकासाचा महत्त्वाचा भाग बनले आहे. या धड्यात, आपण सर्व्हरवरून डेटा असिंक्रोनस पद्धतीने कसा मिळवायचा आणि HTML पुन्हा लोड न करता वेब पृष्ठावर माहिती कशी दाखवायची हे पाहू. ### पूर्वतयारी या धड्यासाठी तुम्ही [लॉगिन आणि नोंदणी फॉर्म](../2-forms/README.md) तयार केलेला असणे आवश्यक आहे. तुम्हाला [Node.js](https://nodejs.org) स्थापित करणे आणि [सर्व्हर API चालवणे](../api/README.md) आवश्यक आहे जेणेकरून तुम्हाला खाते डेटा मिळेल. सर्व्हर योग्यरित्या चालू आहे की नाही हे तपासण्यासाठी टर्मिनलमध्ये खालील कमांड चालवा: ```sh curl http://localhost:5000/api # -> should return "Bank API v1.0.0" as a result ``` --- ## AJAX आणि डेटा मिळवणे पारंपरिक वेब साइट्समध्ये, वापरकर्ता लिंक निवडतो किंवा फॉर्मद्वारे डेटा सबमिट करतो तेव्हा संपूर्ण HTML पृष्ठ पुन्हा लोड करून सामग्री अपडेट केली जाते. नवीन डेटा लोड करण्यासाठी प्रत्येक वेळी वेब सर्व्हर नवीन HTML पृष्ठ परत करतो, ज्यामुळे ब्राउझरला प्रक्रिया करावी लागते, सध्याची क्रिया थांबते आणि रीलोड दरम्यान परस्परसंवाद मर्यादित होतो. या कार्यप्रवाहाला *मल्टी-पेज अॅप्लिकेशन* किंवा *MPA* म्हणतात.  वेब अॅप्लिकेशन्स अधिक जटिल आणि परस्परसंवादी होऊ लागल्यावर, [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) नावाची नवीन तंत्रज्ञान विकसित झाली. या तंत्रज्ञानामुळे वेब अॅप्स JavaScript वापरून सर्व्हरकडून डेटा असिंक्रोनस पद्धतीने पाठवू आणि मिळवू शकतात, HTML पृष्ठ पुन्हा लोड करण्याची गरज नसते, परिणामी जलद अपडेट्स आणि गुळगुळीत परस्परसंवाद होतो. सर्व्हरकडून नवीन डेटा प्राप्त झाल्यावर, JavaScript वापरून [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API च्या मदतीने विद्यमान HTML पृष्ठ अपडेट करता येते. कालांतराने, ही पद्धत [*सिंगल-पेज अॅप्लिकेशन* किंवा *SPA*](https://en.wikipedia.org/wiki/Single-page_application) म्हणून विकसित झाली.  AJAX प्रथम सादर झाल्यावर, असिंक्रोनस पद्धतीने डेटा मिळवण्यासाठी उपलब्ध असलेली एकमेव API [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest) होती. परंतु आधुनिक ब्राउझर आता अधिक सोयीस्कर आणि शक्तिशाली [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API) लागू करतात, जी प्रॉमिसेस वापरते आणि JSON डेटा हाताळण्यासाठी अधिक योग्य आहे. > सर्व आधुनिक ब्राउझर `Fetch API` ला समर्थन देतात, परंतु तुमचे वेब अॅप्लिकेशन जुने ब्राउझरवर चालवायचे असल्यास, [caniuse.com वर सुसंगतता टेबल](https://caniuse.com/fetch) तपासणे नेहमीच चांगले असते. ### कार्य [मागील धड्यात](../2-forms/README.md) आपण खाते तयार करण्यासाठी नोंदणी फॉर्म अंमलात आणला. आता आपण विद्यमान खात्याचा वापर करून लॉगिन करण्यासाठी कोड जोडू आणि त्याचा डेटा मिळवू. `app.js` फाइल उघडा आणि नवीन `login` फंक्शन जोडा: ```js async function login() { const loginForm = document.getElementById('loginForm') const user = loginForm.user.value; } ``` येथे आपण `getElementById()` वापरून फॉर्म एलिमेंट मिळवतो आणि नंतर `loginForm.user.value` वापरून इनपुटमधून वापरकर्त्याचे नाव मिळवतो. प्रत्येक फॉर्म कंट्रोलला त्याच्या नावाने (HTML मध्ये `name` अॅट्रिब्युट वापरून सेट केलेले) फॉर्मच्या प्रॉपर्टी म्हणून प्रवेश करता येतो. नोंदणीसाठी आपण जे केले त्याचप्रमाणे, सर्व्हर विनंती करण्यासाठी आणखी एक फंक्शन तयार करू, परंतु यावेळी खाते डेटा मिळवण्यासाठी: ```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 वापरून सर्व्हरकडून डेटा असिंक्रोनस पद्धतीने मिळवतो, परंतु यावेळी आम्हाला URL व्यतिरिक्त कोणतेही अतिरिक्त पॅरामीटर्स आवश्यक नाहीत, कारण आम्ही फक्त डेटा क्वेरी करत आहोत. डीफॉल्टनुसार, `fetch` [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP विनंती तयार करते, जी येथे आपल्याला हवी आहे. ✅ `encodeURIComponent()` ही एक फंक्शन आहे जी URL साठी विशेष वर्ण एस्केप करते. जर आपण ही फंक्शन कॉल केली नाही आणि थेट `user` मूल्य URL मध्ये वापरले तर कोणत्या समस्या उद्भवू शकतात? आता आपण `login` फंक्शन अपडेट करून `getAccount` वापरणार आहोत: ```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'); } ``` प्रथम, `getAccount` हे असिंक्रोनस फंक्शन असल्याने आम्हाला सर्व्हरच्या निकालाची वाट पाहण्यासाठी `await` कीवर्ड वापरावा लागतो. कोणत्याही सर्व्हर विनंतीप्रमाणे, आपल्याला त्रुटींचा सामना करावा लागतो. सध्या आम्ही फक्त त्रुटी दाखवण्यासाठी लॉग संदेश जोडणार आहोत आणि नंतर त्याकडे परत येऊ. यानंतर, आम्हाला डेटा कुठेतरी साठवावा लागतो जेणेकरून नंतर डॅशबोर्ड माहिती दाखवण्यासाठी त्याचा उपयोग करता येईल. कारण `account` व्हेरिएबल अद्याप अस्तित्वात नाही, आम्ही आमच्या फाइलच्या शीर्षस्थानी एक ग्लोबल व्हेरिएबल तयार करू: ```js let account = null; ``` वापरकर्त्याचा डेटा व्हेरिएबलमध्ये सेव्ह झाल्यानंतर, आपण *लॉगिन* पृष्ठावरून *डॅशबोर्ड* वर `navigate()` फंक्शन वापरून जाऊ शकतो. शेवटी, लॉगिन फॉर्म सबमिट केल्यावर आपले `login` फंक्शन कॉल करण्यासाठी HTML मध्ये बदल करणे आवश्यक आहे: ```html