Middleware, uygulamanın ana mantığından önce veya sonra verileri işleyen, çapraz kesen endişeleri iş kodundan ayıran bir ara yazılım katmanıdır. Redux (2026)'ya göre, middleware merkezi işleme sayesinde günlükleme ve kimlik doğrulama kod tekrarını %40 oranında azaltır. Redux middleware klasik bir örnektir, ancak desen daha geniş çapta kullanılır: Ktor Client, Bloc, Express.js ve Dio.
Önemli Noktalar
Middleware, iki sistem bileşeni arasında bulunan, verileri yakalayıp işleyen ve hedef bileşene ileten bir yazılım katmanıdır. Mobil geliştirmede, middleware üç ana bağlamda kullanılır: durum yönetimi (Redux, Bloc), HTTP iletişimleri (Ktor Client, Dio) ve olay işleme (EventBus, NotificationCenter). Temel değer, uygulamanın alan mantığından çapraz kesen endişelerin (günlükleme, kimlik doğrulama, analitik) ayrılmasıdır. Her ekrana analitik çağrısı eklemek yerine, middleware bunu merkezi olarak yapar.
Middleware Pipe and Filter desenini uygular: her middleware bileşeni verileri alır, işler ve zincirin bir sonraki halkasına iletir. Middleware bağlantı sırası, işleme sırasını belirler — ilk middleware ham verileri alır, sonuncusu hedef işleyiciye iletir. JetBrains (2026)'ya göre, bu mimari mevcut kodu değiştirmeden middleware eklemeye veya çıkarmaya izin verir, testleri ve deneysel modüllerin A/B testlerini basitleştirir.
Middleware genel bir desendir, Interceptor ise HTTP için özel durumudur. Middleware herhangi bir veri akışıyla çalışır: Redux'ta action'lar, Bloc'ta olaylar, Ktor'da HTTP istekleri. Interceptor her zaman ağ katmanına bağlıdır ve yalnızca Request/Response ile çalışır. Bu farkı anlamak, doğru soyutlamayı seçmeye yardımcı olur: kullanıcı eylemlerini günlüklemek için — middleware, başlık eklemek için — Interceptor. Büyük projelerde, her iki desen sıklıkla bir arada bulunur: middleware durumu yönetir, Interceptor HTTP iletişimlerini halleder.
Redux middleware, reducer'a ulaşmadan önce her dispatch action'ını yakalar. Bu, action'ları günlüklemeye, Redux Thunk veya Redux Saga aracılığıyla asenkron istekler yapmaya, bir action'ı değiştirmeye veya koşullu olarak iptal etmeye olanak tanır. Her middleware store (duruma erişim), next (sonraki middleware veya reducer referansı) ve action alır, ne yapacağına karar verir: action'ı iletmek, değiştirmek veya engellemek.
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 için Dart'ta analyticsMiddleware örneği. Middleware tüm NavigationAction'ları yakalar, ekran adını analitik sistemine kaydeder ve zinciri devam ettirmek için next(action)'ı çağırır. next çağrılmazsa, action reducer'a ulaşmaz — bu şekilde koşullu navigasyon uygulanabilir veya istenmeyen action'lar engellenebilir. Dizideki middleware sırası, işleme sırasını belirler.
Redux Thunk, yalnızca action nesnelerini değil aynı zamanda işlevleri de göndermeye izin veren bir middleware'tir. İşlev dispatch ve getState alır, asenkron işlemler gerçekleştirebilir (HTTP istemcisi aracılığıyla API istekleri, DB'den okuma) ve tamamlandığında normal action'lar gönderebilir. Bu, Redux uygulamalarında ağ istekleri için standart yaklaşımdır. Redux Saga daha karmaşık senaryolar için oluşturucuları (yield) kullanır: istek iptali, yarış koşulları, paralel işlemler ve kullanıcı girişi debounce. Redux Saga (2026)'ya göre, Saga coroutine'leri iç içe Thunk geri çağrılarından daha kolay test edilir ve hata ayıklanır.
Ktor Client (JetBrains) pipeline middleware tabanlı HTTP işleme oluşturur. İsteğin her aşaması — bağlantı kurulumu, başlık gönderme, yanıt okuma — pipeline'da ayrı bir aşama ile temsil edilir. Geliştirici, client.install { } aracılığıyla eklentileri (middleware) kurar ve bir işleme zinciri elde eder. Kurulum sırası, hangi middleware'in verileri önce işleyeceğini belirler: 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
}
}
Kurulu middleware eklentileriyle Ktor Client yapılandırması. Logging — istek ve yanıt gövdesini yazar. Auth — yenileme desteğiyle otomatik olarak Bearer token ekler. ContentNegotiation — JSON serileştirme/seri çözme yapar. HttpTimeout — zaman aşımlarını ayarlar. Her eklenti bağımsızdır: test ortamında, istek kodunu değiştirmeden istemci yapılandırmasını değiştirerek Auth devre dışı bırakılabilir.
Dio, Flutter için popüler bir HTTP istemcisidir ve Interceptor'ü middleware olarak kullanır. Interceptor, göndermeden önce RequestOptions'ı ve aldıktan sonra Response'u yakalar, birden çok yakalayıcı zincirini destekler. Dio Interceptor, Dart/Flutter için OkHttp Interceptor'a benzer. Dio (2026)'ya göre, RetryInterceptor ve LogInterceptor, Flutter projelerinde en sık kullanılan middleware'lerdir.
Bloc'ta ayrı bir bileşen olarak yerleşik middleware bulunmaz, ancak desen BlocObserver (uygulamadaki her bloktan olayları alan küresel bir gözlemci) aracılığıyla uygulanır. BlocObserver.onEvent her olayı işlemeden önce, onTransition her durum geçişinde, onError her istisnada çağrılır. Bu, analitik, günlükleme, çökme raporlama ve performans izleme için tam teşekküllü bir middleware'tir.
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'ta Bloc için AppBlocObserver örneği. onEvent her olayı Crashlytics'e kaydeder, onTransition olayları analitik'e gönderir, onError istisnaları çökme raporlamasına yazar. BlocOverrides.runZoned aracılığıyla bağlantı, gözlemciyi kodlarını değiştirmeden tüm bloklar için küresel hale getirir. Testlerde devre dışı bırakmak için boş bir gözlemci iletmek veya BlocOverrides'ı geçersiz kılmamak yeterlidir.
Middleware etkilidir birçok bileşeni etkileyen görevler için: günlükleme, kimlik doğrulama, analitik, önbellekleme, performans izleme. Aynı mantık uygulamanın farklı bölümlerinde tekrarlandığında middleware kullanın — her isteğe token ekleme, her kullanıcı eylemini günlükleme, her ekran geçişinin analitiği. Dio (2026)'ya göre, middleware aracılığıyla merkezi işleme, her bileşende ayrı ayrı kodu kopyalamaya kıyasla hataları %25 azaltır.
En sık yapılan hata yanlış middleware sırasıdır, ilk yakalayıcının ikincinin eklediği verileri beklemesidir. İkinci en sık hata, ana iş parçacığında middleware'te engelleyici işlemlerdir: dosya yazma, senkron HTTP çağrıları, şifreleme. Üçüncüsü, istisna işleme eksikliğidir: bir middleware istisna atarsa, tüm zincir kırılır ve action reducer'a ulaşmaz veya istek gönderilmez. Her zaman middleware mantığını try-catch ile sarın ve zinciri kırmadan Crashlytics veya Sentry'ye hataları kaydedin. Kod incelemeleri sırasında middleware zincirini düzenli olarak kontrol edin — bu, mimari bozulmasını önler.
Sıkça Sorulan Sorular
Interceptor, HTTP iletişimleri için middleware'in özel bir durumudur. Middleware daha geniş bir desendir: eylemleri (Redux), olayları (Bloc), HTTP'yi (Ktor) ve herhangi bir veri akışını işleyebilir. Interceptor her zaman ağ katmanına bağlıdır ve yalnızca Request/Response ile çalışır.
Dev ve prod için farklı bir middleware seti döndüren bir fabrika yöntemi veya DI kapsayıcısı (Dagger, Koin, GetIt) kullanın. Redux'ta, testlerde boş bir dizi iletin. Ktor'da, eklentisiz bir test HttpClient'ı kullanın. Ana ilke — middleware koda sabit kodlanmamalıdır.
Evet — middleware, action'ı reducer'a veya sonraki middleware'e iletmeden önce değiştirir. Örneğin, Redux middleware, gönderici kodunu değiştirmeden her action'a meta veri (userId, timestamp, deviceId) ekleyebilir. Ana kural — orijinal nesneyi mutasyona uğratmamak, spread operatörü aracılığıyla yeni bir tane oluşturmaktır.
Ktor'da terimler birbirinin yerine kullanılabilir — Ktor Client middleware ve eklenti aynı anlama gelir. Her eklenti HttpClientPlugin'ı uygular ve client.install { } aracılığıyla kurulur. Tüm eklentiler istek pipeline'ına gömülür ve bir işleme zinciri oluşturur.
BlocObserver.onError'ı geçersiz kılarak — herhangi bir blokta her istisnada çağrılan küresel bir işleyici. Bu, her blokta try-catch'e bir alternatiftir: bir middleware hataları merkezi olarak işler, Crashlytics'e yazar ve kullanıcıya snackbar gösterir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun