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 → 404Plan
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
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 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
ad, ok := urunler[r.____("id")]
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ı |