# بینکنگ ایپ بنائیں حصہ 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