CodeBlanks Logo Icon CodeBlanks

Meydan okuma 2 - Mikroservis

  • Go kursu
  • İleri seviye
  • Ders 66/68
  • 8 dk

HTTP API + veritabanı + Docker içeren bir servis yazarsın.

Meydan okuma: sağlam bir servis

Bir HTTP servisini üretime hazırlayan üç parçayı birleştireceksin: istek kimliği ekleyen middleware, panic'i 500'e çeviren recover middleware ve yalnızca GET /urunler/{id} rotasını sunan bir mux. Bilinmeyen id için 404 dönülecek.

zincir: recoverMW → istekID → mux
GET /urunler/1  → 200 "Kalem"
GET /urunler/9  → 404

Plan

1) urunler := map[string]string{"1": "Kalem"}. 2) mux.HandleFunc("GET /urunler/{id}", ...) içinde r.PathValue("id") ile ara. 3) h := recoverMW(istekID(mux)). 4) httptest ile iki istek gönder, kodları yazdır. Middleware'leri önceki gruplardaki gibi yaz; sıra önemli: recover en dışta.

Uygulama Servisi kur

Yukarıdaki planı uygula. GET /urunler/1 ve GET /urunler/9 isteklerinin durum kodlarını tek satırda 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 istekID(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("X-Request-ID", "r1")
        next.ServeHTTP(w, r)
    })
}

func main() {
    urunler := map[string]string{"1": "Kalem"}
    mux := http.NewServeMux()
    mux.HandleFunc("GET /urunler/{id}", func(w http.ResponseWriter, r *http.Request) {
        ad, ok := urunler[r.PathValue("id")]
        if !ok {
            http.NotFound(w, r)
            return
        }
        fmt.Fprint(w, ad)
    })
    h := recoverMW(istekID(mux))
    kod := func(yol string) int {
        rec := httptest.NewRecorder()
        h.ServeHTTP(rec, httptest.NewRequest("GET", yol, nil))
        return rec.Code
    }
    fmt.Println(kod("/urunler/1"), kod("/urunler/9"))
}

Beklenen çıktı

200 404

Soru ve cevaplar

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

1 Rotadaki id'yi okuyup map'te bulamazsan ne yaparsın?

  • 200 ve boş gövde dönerim
  • Sunucuyu kapatırım
  • http.NotFound(w, r) ile 404 dönerim Doğru cevap
  • panic çağırırım

Açıklama: Bulunamayan kaynak beklenen bir durumdur; panic değil, 404 ile bildirilir.

2 Yol değişkeni

Soru
ad, ok := urunler[r.____("id")]
Cevap
ad, ok := urunler[r.PathValue("id")]

Açıklama: PathValue, rota kalıbındaki {id} değişkenini okur.

3 Parça ve görevi

Kavram Anlamı
recoverMW Panic → 500
istekID X-Request-ID
mux Rotalama
http.NotFound 404 yanıtı

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