CodeBlanks Logo Icon CodeBlanks

Middleware kavramı

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

Middleware kavramını ve katmanlı yapısını öğrenirsin.

Middleware kavramı

Middleware, bir HTTP isteği asıl işleyiciye ulaşmadan önce ve sonra çalışan ara katmandır. Kayıt tutma, kimlik doğrulama, sıkıştırma, zaman ölçme gibi her rotada tekrar edecek işleri tek yerde toplar.

istek → [log] → [auth] → işleyici
yanıt ← [log] ← [auth] ← işleyici

Go'da middleware basitçe bir http.Handler alıp yeni bir http.Handler döndüren fonksiyondur.

Neden middleware?

Her işleyicinin başına aynı log ve yetki kodunu kopyalamak hem tekrar hem de unutulma riski demektir. Middleware ile bu kod bir kez yazılır ve istediğin rotalara uygulanır. Ayrıca işleyiciler yalnızca kendi işlerine odaklanır; test etmeleri kolaylaşır.

Uygulama İlk middleware

func etiket(next http.Handler) http.Handler yaz: yanıta X-Ders: go başlığını ekleyip next.ServeHTTP(w, r) çağırsın. httptest ile test et ve başlığı 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 etiket(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("X-Ders", "go")
        next.ServeHTTP(w, r)
    })
}

func main() {
    h := etiket(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
    rec := httptest.NewRecorder()
    h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
    fmt.Println(rec.Header().Get("X-Ders"))
}

Beklenen çıktı

go

Soru ve cevaplar

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

1 Go'da tipik middleware imzası hangisidir?

  • func(http.ResponseWriter)
  • func() error
  • func(*http.Request) bool
  • func(http.Handler) http.Handler Doğru cevap

Açıklama: Middleware bir işleyiciyi sarar: işleyiciyi alır, çevresine iş ekleyen yeni bir işleyici döndürür.

2 Sarılan tür

Soru
func logla(next http.____) http.Handler {
Cevap
func logla(next http.Handler) http.Handler {

Açıklama: Middleware bir http.Handler alır ve yine http.Handler döndürür.

3 Middleware kullanımı

Kavram Anlamı
Log İsteği kaydeder
Auth Yetkiyi denetler
Recover Panic'i yakalar
Gzip Yanıtı sıkıştırır

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