مڈل ویئر ایک درمیانی سافٹ ویئر کی تہہ ہے جو ایپلی کیشن کے مرکزی منطق سے پہلے یا بعد میں ڈیٹا پر کارروائی کرتی ہے، عبوری خدشات کو کاروباری کوڈ سے الگ کرتی ہے۔ Redux (2026) کے مطابق، مڈل ویئر مرکزی پروسیسنگ کے ذریعے لاگنگ اور تصدیق کے کوڈ کے دہراؤ کو 40% تک کم کرتا ہے۔ Redux مڈل ویئر ایک کلاسک مثال ہے، لیکن یہ نمونہ وسیع پیمانے پر استعمال ہوتا ہے: Ktor Client، Bloc، Express.js اور Dio۔
اہم نکات
مڈل ویئر ایک سافٹ ویئر کی تہہ ہے جو دو سسٹم اجزاء کے درمیان واقع ہوتی ہے، ڈیٹا کو روکتی ہے اور اس پر کارروائی کرنے کے بعد ہدف کے جزو تک پہنچاتی ہے۔ موبائل ڈیولپمنٹ میں، مڈل ویئر تین اہم سیاق و سباق میں استعمال ہوتا ہے: اسٹیٹ مینجمنٹ (Redux، Bloc)، HTTP مواصلات (Ktor Client، Dio) اور ایونٹ ہینڈلنگ (EventBus، NotificationCenter)۔ بنیادی قدر ایپلی کیشن کے ڈومین منطق سے عبوری خدشات کی علیحدگی (لاگنگ، تصدیق، تجزیات) ہے۔ ہر اسکرین میں تجزیات کی کالز شامل کرنے کے بجائے، مڈل ویئر یہ مرکزی طور پر کرتا ہے۔
مڈل ویئر Pipe and Filter پیٹرن کو لاگو کرتا ہے: ہر مڈل ویئر جزو ڈیٹا وصول کرتا ہے، اس پر کارروائی کرتا ہے اور زنجیر کی اگلی کڑی کو منتقل کرتا ہے۔ مڈل ویئر کے کنکشن کی ترتیب پروسیسنگ کی ترتیب کا تعین کرتی ہے — پہلا مڈل ویئر خام ڈیٹا وصول کرتا ہے، آخری اسے ہدف ہینڈلر تک پہنچاتا ہے۔ JetBrains (2026) کے مطابق، یہ فن تعمیر موجودہ کوڈ کو تبدیل کیے بغیر مڈل ویئر شامل کرنے یا ہٹانے کی اجازت دیتا ہے، جس سے جانچ اور تجرباتی ماڈیولز کی A/B جانچ آسان ہو جاتی ہے۔
مڈل ویئر ایک عام پیٹرن ہے، Interceptor HTTP کے لیے اس کا خصوصی معاملہ ہے۔ مڈل ویئر ڈیٹا کے کسی بھی بہاؤ کے ساتھ کام کرتا ہے: Redux میں actions، Bloc میں واقعات، Ktor میں HTTP درخواستیں۔ Interceptor ہمیشہ نیٹ ورک کی تہہ سے منسلک ہوتا ہے اور صرف Request/Response کے ساتھ کام کرتا ہے۔ اس فرق کو سمجھنا صحیح تجرید کا انتخاب کرنے میں مدد کرتا ہے: صارف کے اعمال کو لاگ کرنے کے لیے — مڈل ویئر، ہیڈر شامل کرنے کے لیے — Interceptor۔ بڑے پروجیکٹس میں، دونوں پیٹرن اکثر ایک ساتھ رہتے ہیں: مڈل ویئر اسٹیٹ کا انتظام کرتا ہے، Interceptor HTTP مواصلات کو سنبھالتا ہے۔
Redux مڈل ویئر reducer تک پہنچنے سے پہلے ہر dispatch action کو روکتا ہے۔ یہ actions کو لاگ کرنے، Redux Thunk یا Redux Saga کے ذریعے غیر متزلزل درخواستیں کرنے، action میں ترمیم کرنے یا شرطی طور پر منسوخ کرنے کی اجازت دیتا ہے۔ ہر مڈل ویئر store (اسٹیٹ تک رسائی)، next (اگلے مڈل ویئر یا reducer کا حوالہ) اور action وصول کرتا ہے، اور فیصلہ کرتا ہے کہ کیا کرنا ہے: action کو آگے بھیجنا، اس میں ترمیم کرنا یا روکنا۔
Middleware<AppState> analyticsMiddleware = (store, action, NextDispatcher next) {
if (action is NavigationAction) {
Analytics.logEvent(action.screenName);
}
return next(action);
};
final store = Store<AppState>>(
reducer,
initialState,
middleware: [analyticsMiddleware]
);
Flutter Redux کے لیے Dart میں analyticsMiddleware کی مثال۔ مڈل ویئر تمام NavigationAction کو روکتا ہے، اسکرین کا نام تجزیاتی نظام میں لاگ کرتا ہے اور زنجیر جاری رکھنے کے لیے next(action) کو کال کرتا ہے۔ اگر next کو کال نہ کیا جائے تو، action reducer تک نہیں پہنچے گا — اس طرح مشروط نیویگیشن کو لاگو کیا جا سکتا ہے یا ناپسندیدہ actions کو روکا جا سکتا ہے۔ صف میں مڈل ویئر کی ترتیب پروسیسنگ کی ترتیب کا تعین کرتی ہے۔
Redux Thunk ایک مڈل ویئر ہے جو نہ صرف action آبجیکٹ بلکہ فنکشنز بھی بھیجنے کی اجازت دیتا ہے۔ فنکشن dispatch اور getState وصول کرتا ہے، غیر متزلزل کارروائیاں (HTTP کلائنٹ کے ذریعے API درخواستیں، DB سے پڑھنا) کر سکتا ہے اور مکمل ہونے پر عام actions بھیج سکتا ہے۔ Redux ایپلی کیشنز میں نیٹ ورک کی درخواستوں کے لیے یہ معیاری طریقہ ہے۔ Redux Saga مزید پیچیدہ منظرناموں کے لیے جنریٹر (yield) استعمال کرتا ہے: درخواست منسوخی، ریس کنڈیشنز، متوازی کارروائیاں اور صارف ان پٹ ڈیباؤنس۔ Redux Saga (2026) کے مطابق، Saga coroutines nested Thunk callbacks کے مقابلے میں جانچ اور ڈیبگ کرنا آسان ہیں۔
Ktor Client JetBrains کا پائپ لائن مڈل ویئر پر مبنی HTTP پروسیسنگ بناتا ہے۔ درخواست کا ہر مرحلہ — کنکشن سیٹ اپ، ہیڈر بھیجنا، جواب پڑھنا — پائپ لائن میں ایک علیحدہ مرحلے سے ظاہر ہوتا ہے۔ ڈیولپر client.install { } کے ذریعے پلگ ان (مڈل ویئر) انسٹال کرتا ہے، ایک پروسیسنگ چین حاصل کرتا ہے۔ انسٹالیشن کی ترتیب طے کرتی ہے کہ کون سا مڈل ویئر پہلے ڈیٹا پر کارروائی کرتا ہے: Logging، Auth، ContentNegotiation، Caching۔
val client = HttpClient {
install(Logging) {
level = LogLevel.BODY
}
install(Auth) {
bearer {
loadTokens { BearerTokens("access", "refresh") }
}
}
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
install(HttpTimeout) {
requestTimeoutMillis = 15000
}
}
انسٹال شدہ مڈل ویئر پلگ ان کے ساتھ Ktor Client کی تشکیل۔ Logging — درخواست اور جواب کا باڈی لکھتا ہے۔ Auth — ریفریش سپورٹ کے ساتھ خود بخود Bearer ٹوکن شامل کرتا ہے۔ ContentNegotiation — JSON کو سیریلائز/ڈی سیریلائز کرتا ہے۔ HttpTimeout — ٹائم آؤٹ سیٹ کرتا ہے۔ ہر پلگ ان آزاد ہے: ٹیسٹ ماحول میں درخواست کوڈ کو تبدیل کیے بغیر کلائنٹ کنفیگریشن تبدیل کر کے Auth کو غیر فعال کیا جا سکتا ہے۔
Dio Flutter کے لیے ایک مقبول HTTP کلائنٹ ہے، جو Interceptor کو مڈل ویئر کے طور پر استعمال کرتا ہے۔ Interceptor بھیجنے سے پہلے RequestOptions اور وصول کرنے کے بعد Response کو روکتا ہے، متعدد انٹرسیپٹرز کی زنجیر کو سپورٹ کرتا ہے۔ Dio Interceptor Dart/Flutter کے لیے OkHttp Interceptor کے مشابہ ہے۔ Dio (2026) کے مطابق، RetryInterceptor اور LogInterceptor Flutter پروجیکٹس میں سب سے زیادہ استعمال ہونے والے مڈل ویئر ہیں۔
Bloc میں علیحدہ جزو کے طور پر بلٹ ان مڈل ویئر نہیں ہے، لیکن پیٹرن BlocObserver (ایک عالمی مبصر جو ایپلی کیشن میں ہر بلاک سے واقعات وصول کرتا ہے) کے ذریعے لاگو کیا جاتا ہے۔ BlocObserver.onEvent ہر واقعہ پر کارروائی سے پہلے کال کیا جاتا ہے، onTransition ہر اسٹیٹ ٹرانزیشن پر، onError ہر استثنا پر۔ یہ تجزیات، لاگنگ، کریش رپورٹنگ اور کارکردگی کی نگرانی کے لیے ایک مکمل مڈل ویئر ہے۔
class AppBlocObserver extends BlocObserver {
@override
void onEvent(Bloc bloc, Object? event) {
Crashlytics.log("${bloc.runtimeType}: $event");
super.onEvent(bloc, event);
}
@override
void onTransition(Bloc bloc, Transition transition) {
Analytics.log(transition.eventName());
super.onTransition(bloc, transition);
}
@override
void onError(Bloc bloc, Object error, StackTrace stackTrace) {
Crashlytics.recordError(error, stackTrace);
super.onError(bloc, error, stackTrace);
}
}
BlocOverrides.runZoned(() {
runApp(MyApp());
}, blocObserver: AppBlocObserver());
Dart میں Bloc کے لیے AppBlocObserver کی مثال۔ onEvent ہر واقعہ کو Crashlytics میں لاگ کرتا ہے، onTransition واقعات کو تجزیات میں بھیجتا ہے، onError استثناؤں کو کریش رپورٹنگ میں لکھتا ہے۔ BlocOverrides.runZoned کے ذریعے کنکشن مبصر کو ان کے کوڈ کو تبدیل کیے بغیر تمام بلاکس کے لیے عالمی بنا دیتا ہے۔ ٹیسٹوں میں غیر فعال کرنے کے لیے، خالی مبصر بھیجنا یا BlocOverrides کو اوور رائڈ نہ کرنا کافی ہے۔
مڈل ویئر مؤثر ہے ان کاموں کے لیے جو بہت سے اجزاء کو متاثر کرتے ہیں: لاگنگ، تصدیق، تجزیات، کیشنگ، کارکردگی کی نگرانی۔ مڈل ویئر استعمال کریں جب ایک ہی منطق ایپلی کیشن کے مختلف حصوں میں دہرائی جائے — ہر درخواست میں ٹوکن شامل کرنا، ہر صارف کے عمل کو لاگ کرنا، ہر اسکرین ٹرانزیشن کا تجزیہ۔ Dio (2026) کے مطابق، مڈل ویئر کے ذریعے مرکزی پروسیسنگ بگ کو 25% کم کرتی ہے ہر جزو میں الگ الگ کوڈ کو نقل کرنے کے مقابلے میں۔
سب سے عام غلطی غلط مڈل ویئر ترتیب ہے، جب پہلا انٹرسیپٹر اس ڈیٹا کی توقع کرتا ہے جو دوسرا شامل کرتا ہے۔ دوسری سب سے عام غلطی مرکزی تھریڈ پر مڈل ویئر میں مسدود کرنے والی کارروائیاں ہیں: فائل لکھنا، ہم آہنگ HTTP کالز، خفیہ کاری۔ تیسری استثنا ہینڈلنگ کی کمی ہے: اگر مڈل ویئر استثنا پھینکتا ہے تو، پوری زنجیر ٹوٹ جاتی ہے اور action reducer تک نہیں پہنچے گا یا درخواست نہیں بھیجی جائے گی۔ ہمیشہ مڈل ویئر منطق کو try-catch میں لپیٹیں اور زنجیر کو توڑے بغیر Crashlytics یا Sentry میں خرابیاں لاگ کریں۔ کوڈ کے جائزوں کے دوران باقاعدگی سے مڈل ویئر زنجیر کی جانچ کریں — یہ فن تعمیر کے انحطاط کو روکتا ہے۔
اکثر پوچھے گئے سوالات
Interceptor HTTP مواصلات کے لیے مڈل ویئر کا ایک خصوصی معاملہ ہے۔ مڈل ویئر ایک وسیع تر پیٹرن ہے: یہ actions (Redux)، واقعات (Bloc)، HTTP (Ktor) اور ڈیٹا کے کسی بھی بہاؤ کو سنبھال سکتا ہے۔ Interceptor ہمیشہ نیٹ ورک کی تہہ سے منسلک ہوتا ہے اور صرف Request/Response کے ساتھ کام کرتا ہے۔
فیکٹری طریقہ یا DI کنٹینر (Dagger، Koin، GetIt) استعمال کریں جو dev اور prod کے لیے مڈل ویئر کا مختلف سیٹ لوٹائے۔ Redux میں، ٹیسٹوں میں خالی صف بھیجیں۔ Ktor میں، پلگ ان کے بغیر ٹیسٹ HttpClient استعمال کریں۔ بنیادی اصول — مڈل ویئر کو کوڈ میں ہارڈ کوڈ نہیں ہونا چاہیے۔
ہاں — مڈل ویئر action کو reducer یا اگلے مڈل ویئر میں بھیجنے سے پہلے اس میں ترمیم کرتا ہے۔ مثال کے طور پر، Redux مڈل ویئر ڈسپیچر کوڈ کو تبدیل کیے بغیر ہر action میں میٹا ڈیٹا (userId، timestamp، deviceId) شامل کر سکتا ہے۔ بنیادی اصول — اصل آبجیکٹ کو تبدیل نہ کریں بلکہ اسپریڈ آپریٹر کے ذریعے نیا بنائیں۔
Ktor میں، اصطلاحات قابل تبادلہ ہیں — Ktor Client مڈل ویئر اور پلگ ان ایک ہی چیز ہیں۔ ہر پلگ ان HttpClientPlugin کو لاگو کرتا ہے اور client.install { } کے ذریعے انسٹال ہوتا ہے۔ تمام پلگ ان درخواست پائپ لائن میں شامل ہوتے ہیں، ایک پروسیسنگ چین تشکیل دیتے ہیں۔
BlocObserver.onError کو اوور رائڈ کر کے — ایک عالمی ہینڈلر جو کسی بھی بلاک میں ہر استثنا پر کال کیا جاتا ہے۔ یہ ہر بلاک میں try-catch کا متبادل ہے: ایک مڈل ویئر مرکزی طور پر غلطیوں کو ہینڈل کرتا ہے، انہیں Crashlytics میں لکھتا ہے اور صارف کو snackbar دکھاتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں