CodeBlanks Logo Icon CodeBlanks

Özet - net/http

HandleFunc ve JSON'ı birleştirerek bir API yazarsın.

net/http özeti

İstemci: zaman aşımlı http.Client, NewRequestWithContext, Do, StatusCode kontrolü, defer resp.Body.Close(). Sunucu: http.Handler/HandleFunc, Go 1.22 ServeMux kalıpları ("GET /yol/{id}"), zaman aşımlı http.Server, JSON yardımcıları, MaxBytesReader. Test: httptest.NewRecorder ve httptest.NewServer.

Nazik kapanış

Sunucuyu kapatırken açık istekleri yarıda kesmemek için Shutdown kullanılır:

go func() {
    if err := srv.ListenAndServe(); err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()
<-ctx.Done()  // SIGTERM
kapat, iptal := context.WithTimeout(context.Background(), 10*time.Second)
defer iptal()
srv.Shutdown(kapat)

Shutdown yeni bağlantıları reddeder ve mevcut istekler bitene (ya da süre dolana) kadar bekler.

Uygulama Uçtan uca

Bir ServeMux'ta "GET /saglik" rotası {"durum":"ok"} JSON'u döndürsün. httptest.NewServer(mux) ile başlat, http.Get ile iste, gövdeyi map[string]string'e çöz ve durum değerini yazdır.

Başlangıç kodu

main.go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("GET /saglik", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(map[string]string{"durum": "ok"})
    })
    srv := httptest.NewServer(mux)
    defer srv.Close()

    resp, err := http.Get(srv.URL + "/saglik")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer resp.Body.Close()
    var m map[string]string
    json.NewDecoder(resp.Body).Decode(&m)
    fmt.Println(m["durum"])
}

Beklenen çıktı

ok

Soru ve cevaplar

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

1 İşleyiciyi gerçek ağ açmadan test etmenin yolu hangisidir?

  • Mümkün değildir
  • httptest.NewRecorder + httptest.NewRequest Doğru cevap
  • http.ListenAndServe
  • curl

Açıklama: Recorder bir ResponseWriter taklididir; işleyici doğrudan çağrılır ve kod, başlık, gövde bellekten okunur.

2 Kapanış hatası

Soru
if err := srv.ListenAndServe(); err != http.____ {
    log.Fatal(err)
}
Cevap
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
    log.Fatal(err)
}

Açıklama: Shutdown sonrası ListenAndServe ErrServerClosed döndürür; bu beklenen bir durumdur.

3 Grubun özeti

Kavram Anlamı
http.Client{Timeout} Güvenli istemci
ServeMux Yönlendirme
httptest Ağsız test
srv.Shutdown Nazik kapanış

Orta seviye bölümündeki tüm dersler