Özet - Middleware
- Go kursu
- İleri seviye
- Ders 36/68
- 4 dk
Logging ve auth middleware'larını birleştirirsin.
Middleware özeti
Middleware = func(http.Handler) http.Handler. Bu grupta http.HandlerFunc ile sarmalayıcı yazdın, parametreli middleware kurdun, zincirde sıranın etkisini gördün, ResponseWriter'ı sararak durum kodunu kaydettin ve yetkisiz istekleri 401 ile kestin.
h := zincir(api, recoverMW, logla, yetki)
http.ListenAndServe(":8080", h)Recover middleware
Bir işleyicideki panic tüm sunucuyu düşürmez ama bağlantıyı yarıda keser. Recover middleware bunu 500 yanıtına çevirir:
func recoverMW(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if v := recover(); v != nil {
http.Error(w, "sunucu hatası", 500)
}
}()
next.ServeHTTP(w, r)
})
}Uygulama Recover middleware
recoverMW(next http.Handler) http.Handler yaz: defer + recover() ile panic yakalanırsa http.Error(w, "sunucu hatası", 500) yazsın. panic("x") yapan bir işleyiciyle test edip rec.Code yazdır.
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 recoverMW(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
if v := recover(); v != nil {
http.Error(w, "sunucu hatası", 500)
}
}()
next.ServeHTTP(w, r)
})
}
func main() {
h := recoverMW(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { panic("x") }))
rec := httptest.NewRecorder()
h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
fmt.Println(rec.Code)
}Beklenen çıktı
500
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Panic yakalayan recover middleware'i zincirin neresinde olmalıdır?
- Auth'tan sonra
- Fark etmez
- En dışta Doğru cevap
- En içte
Açıklama: recover yalnızca kendi içinde çalışan kodun panic'ini yakalar; en dışta olursa tüm zinciri korur.
2 Panic'i yakala
defer func() {
if v := ____(); v != nil {
http.Error(w, "hata", 500)
}
}()
defer func() {
if v := recover(); v != nil {
http.Error(w, "hata", 500)
}
}()
Açıklama: recover, defer içindeyken süren panic'i durdurur ve değerini döndürür.
3 Middleware ve görevi
| Kavram | Anlamı |
|---|---|
recoverMW |
Panic → 500 |
logla |
Yol, kod, süre |
yetki |
Kimlik → 401 |
zincir |
Sırayla sarar |