# بینکنگ ایپ بنائیں حصہ 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 (Asynchronous JavaScript and 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 کے لیے خاص کرداروں کو فرار کرتا ہے۔ اگر ہم اس فنکشن کو کال نہ کریں اور URL میں براہ راست `user` ویلیو استعمال کریں تو ہمیں ممکنہ طور پر کیا مسائل ہو سکتے ہیں؟ اب ہم اپنے `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