Go HTTP Middleware کی وضاحت
ہر ایک ہینڈلر (handler) میں ایک ہی کوڈ کو بار بار کاپی اور پیسٹ کرنا بند کریں۔
اگر آپ کو آتھنٹیکیشن (authentication) چیک کرنے، ریکویسٹ کے دورانیے (request duration) کو لاگ کرنے، یا ہر ریکویسٹ میں ایک منفرد آئی ڈی (unique ID) شامل کرنے کی ضرورت ہے، تو اس لاجک کو اپنے بزنس ہینڈلرز کے اندر نہ لکھیں۔ اگر آپ کے پاس 20 ہینڈلرز ہیں، تو آپ کی آتھ لاجک (auth logic) تبدیل ہونے پر آپ کو 20 جگہوں پر اپ ڈیٹ کرنا پڑے گا۔ یہ مینٹیننس (maintenance) کے لحاظ سے ایک ڈراونا خواب ہے۔
مڈل ویئر (Middleware) اس مسئلے کا حل ہے۔ آپ لاجک کو صرف ایک بار لکھتے ہیں۔ آپ اپنے ہینڈلرز کو اس کے گرد لپیٹ (wrap) دیتے ہیں۔ پھر آپ کو اسے دوبارہ چھونے کی ضرورت نہیں پڑتی۔
مڈل ویئر (Middleware) کیا ہے؟
Go میں، مڈل ویئر ایک ایسا فنکشن ہے جو:
• ایک http.Handler قبول کرتا ہے۔
• ایک نیا http.Handler واپس کرتا ہے۔
• اصل ہینڈلر کے چلنے سے پہلے یا بعد میں اقدامات (actions) انجام دیتا ہے۔
اسے ایک پیاز کی طرح سمجھیں۔ ہر تہہ اگلی تہہ کو لپیٹتی ہے۔ ریکویسٹ اندر جاتے ہوئے ہر تہہ سے گزرتی ہے۔ ریسپانس (response) باہر آتے ہوئے ہر تہہ سے گزرتا ہے۔
آپ کیا سیکھیں گے:
• http.Handler انٹرفیس کی بنیاد۔
• شروع سے (from scratch) کسٹم مڈل ویئر کیسے بنایا جائے۔
• متعدد تہوں کو ایک ساتھ کیسے جوڑا (chain) جائے۔
• context کا استعمال کرتے ہوئے چین کے ذریعے ڈیٹا کیسے پاس کیا جائے۔
• ترتیب (ordering) اور panic recovery جیسی ایڈوانسڈ تجاویز۔
اہم نکات (Key Takeaways):
• ترتیب اہم ہے۔ اگر ایک مڈل ویئر context میں کوئی ویلیو سیٹ کرتا ہے، تو چین میں اگلا مڈل ویئر اسے پڑھنے والا ہونا چاہیے۔ اگر آپ انہیں تبدیل کر دیں گے، تو ڈیٹا خالی ہوگا۔
• جلد اخراج (early exit) کے بعد ہمیشہ return کریں۔ اگر آپ کو کوئی غلطی (error) ملے اور آپ http.Error بھیجیں، تو فوری طور پر return کال کریں۔ اگر آپ ایرر بھیجنے کے بعد next.ServeHTTP کال کرتے ہیں، تو آپ کا سرور panic کر جائے گا۔
• context کیز کے لیے کسٹم ٹائپس استعمال کریں۔ کیز (keys) کے لیے سادہ اسٹرنگز (strings) استعمال نہ کریں۔ یہ مختلف پیکیجز کو ایک دوسرے کے ڈیٹا کو اوور رائٹ (overwrite) کرنے سے روکتا ہے۔
• ڈیٹا کو کیپچر کرنے کے لیے ایک ریپر (wrapper) استعمال کریں۔ چونکہ اسٹینڈرڈ http.ResponseWriter آپ کو اسٹیٹس کوڈ (status code) لکھنے کے بعد پڑھنے کی اجازت نہیں دیتا، اس لیے آپ کو اسے روکنے (intercept) اور اپنے لاگز کے لیے محفوظ کرنے کے لیے ایک کسٹم اسٹرکٹ (custom struct) بنانا ہوگا۔
ان پیٹرنز (patterns) میں مہارت حاصل کر کے اپنے Go HTTP سرورز کے لیے ایک مضبوط بنیاد بنائیں۔
