# बँकिंग अॅप तयार करा भाग ३: डेटा मिळवण्याचे आणि वापरण्याचे पद्धती ## पूर्व-व्याख्यान प्रश्नमंजुषा [पूर्व-व्याख्यान प्रश्नमंजुषा](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 पृष्ठ पुन्हा लोड न करता, ज्यामुळे जलद अपडेट्स आणि गुळगुळीत वापरकर्ता परस्परसंवाद शक्य झाले. सर्व्हरकडून नवीन डेटा प्राप्त झाल्यावर, सध्याचे HTML पृष्ठ JavaScript वापरून [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