CodeBlanks Logo Icon CodeBlanks

Ö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

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

Soru
defer func() {
    if v := ____(); v != nil {
        http.Error(w, "hata", 500)
    }
}()
Cevap
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

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