Mobil uygulamalar için Middleware — temeller, mimari ve kullanım

Yazar: IT Sectr Yayınlanma: 2026-03-09 Okuma süresi: 8 dk

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 veri kaynakları ve iş mantığı arasında bir katmandır, çapraz kesen endişeleri ayırır.
  • Redux middleware dispatch'i yakalar ve reducer'dan önce veya sonra action'ı değiştirir.
  • Bloc günlükleme ve analitik için BlocObserver aracılığıyla middleware kullanır.
  • Ktor Client Logging ve Auth eklentileriyle pipeline tabanlı HTTP-middleware oluşturur.
  • Dio Interceptor Flutter'da HTTP istekleri için bir dizi yakalayıcıya sahip middleware'tir.

Middleware Nedir?

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.

Pipe and Filter Mimarisi

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.

Interceptor'dan Farkı

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.

Durum Yönetiminde Middleware

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.

dart
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.

Asenkron Middleware: Thunk ve Saga

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.

HTTP İstemcilerinde Middleware

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.

kotlin
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.

Flutter'da Dio Interceptor

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 Mimarisinde Middleware

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.

dart
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 Ne Zaman ve Nasıl Kullanılır

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.

  • Aşırıya kaçmayın — aşırı middleware hata ayıklamayı zorlaştırır ve ek çağrılar nedeniyle performansı düşürür
  • Sıra önemlidir — ilk middleware verileri orijinal biçiminde alır, sonuncusu tüm değişikliklerden sonra alır
  • Asenkron işlemler — ana UI iş parçacığını engellemeden ağır çağrıları asenkron middleware'e taşıyın
  • Test edilebilirlik — her middleware, mock ortamları aracılığıyla izole olarak test edilmelidir
  • Zinciri belgeleyin — projede hangi middleware'lerin hangi sırayla bağlı olduğunu açıkça tanımlayın

Middleware Kullanımında Sık Yapılan Hatalar

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

Middleware, Interceptor'dan nasıl farklıdır?

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.

Test ortamında middleware nasıl devre dışı bırakılı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.

Middleware, dispatch'ten sonra bir action'ı değiştirebilir mi?

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 middleware ve Interceptor arasındaki fark nedir?

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.

Bloc'ta middleware hataları nasıl işler?

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

  • Middleware, uygulama bileşenleri arasında çapraz kesen endişeleri ayırmak için evrensel bir desendir, Interceptor'dan daha geniştir.
  • Redux middleware, günlükleme, asenkron istekler (Thunk) ve karmaşık senaryolar (Saga) için dispatch'i yakalar.
  • Ktor Client, bağımsız Logging, Auth, ContentNegotiation eklentileriyle pipeline aracılığıyla middleware uygular.
  • BlocObserver, Flutter Bloc için middleware'tir: onEvent, onTransition ve onError tüm blokları küresel olarak işler.
  • Dio Interceptor, Flutter için OkHttp Interceptor'a benzer bir zincire sahip HTTP-middleware'tir.
  • Middleware'in bağlantı sırası veri işleme sırasını belirler — bunu açıkça belgeleyin.
  • Middleware'in doğru kullanımı kod tekrarını %25-40 azaltır ve çapraz kesen endişelerin birim testlerini basitleştirir.

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.

Projeyi tartış

Ayrıca okuyun