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 önceSı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
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func main() {
// buraya yaz
}Örnek çözüm
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
for i := len(mw) - 1; i >= 0; i-- {
h = mw[____](h)
}
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ç |