CodeBlanks Logo Icon CodeBlanks

Middleware zinciri

  • Go kursu
  • İleri seviye
  • Ders 33/68
  • 4 dk

Birden çok middleware'i zincirleme öğrenirsin.

Middleware zinciri

Middleware'ler iç içe sarılarak zincir kurulur. En dıştaki ilk çalışır:

h := logla(yetki(api))  // istek: logla → yetki → api

Çok sayıda middleware olduğunda okunur bir yardımcı yazılır:

func zincir(h http.Handler, mw ...func(http.Handler) http.Handler) http.Handler {
    for i := len(mw) - 1; i >= 0; i-- {
        h = mw[i](h)
    }
    return h
}

h := zincir(api, logla, yetki)  // yine logla önce

Sıra neden önemli?

Recover middleware'i en dışta olmalıdır ki içteki tüm panic'leri yakalasın. Log en dışa yakın durursa yetkisiz istekleri de kaydeder; yetki kontrolünün içinde kalırsa yalnızca geçenleri kaydeder. Sıralama bir tasarım kararıdır: zincir(api, recover, logla, yetki) yaygın bir düzendir.

Uygulama Zincir kur

Çıktıya harf yazdıran iki middleware oluşturan harf(s string) func(http.Handler) http.Handler yaz. h := harf("A")(harf("B")(son)) zinciriyle bir istek gönder; son işleyicisi C yazdırsın.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func harf(s string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            fmt.Println(s)
            next.ServeHTTP(w, r)
        })
    }
}

func main() {
    son := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Println("C") })
    h := harf("A")(harf("B")(son))
    h.ServeHTTP(httptest.NewRecorder(), httptest.NewRequest("GET", "/", nil))
}

Beklenen çıktı

A
B
C

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>a(b(c(h)))</code> zincirinde istek yolunda hangisi ilk çalışır?

  • b
  • a Doğru cevap
  • c
  • h

Açıklama: En dıştaki sarmalayıcı isteği ilk alır; yanıt yolunda ise sıra tersine döner.

2 Sondan başa sar

Soru
for i := len(mw) - 1; i >= 0; i-- {
    h = mw[____](h)
}
Cevap
for i := len(mw) - 1; i >= 0; i-- {
    h = mw[i](h)
}

Açıklama: Listeyi sondan başa sarmak, ilk yazılan middleware'in en dışta kalmasını sağlar.

3 Zincirdeki konum

Kavram Anlamı
Recover En dış
Log Dışa yakın
Auth İşleyiciye yakın
api En iç

İleri seviye bölümündeki tüm dersler