# बँकिंग अॅप तयार करा भाग 3: डेटा मिळवण्याचे आणि वापरण्याचे पद्धती ## पूर्व-व्याख्यान प्रश्नमंजुषा [पूर्व-व्याख्यान प्रश्नमंजुषा](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 (असिंक्रोनस जावास्क्रिप्ट आणि XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) नावाची नवीन तंत्रज्ञान उदयास आली. या तंत्रज्ञानामुळे वेब अॅप्सना जावास्क्रिप्ट वापरून सर्व्हरकडून डेटा असिंक्रोनस पद्धतीने पाठवणे आणि मिळवणे शक्य झाले, HTML पृष्ठ पुन्हा लोड न करता, परिणामी जलद अपडेट्स आणि गुळगुळीत वापरकर्ता परस्परसंवाद मिळतो. सर्व्हरकडून नवीन डेटा प्राप्त झाल्यावर, सध्याचे HTML पृष्ठ जावास्क्रिप्ट वापरून [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API द्वारे अपडेट केले जाऊ शकते. कालांतराने, ही पद्धत आता [*सिंगल-पेज अॅप्लिकेशन* किंवा *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