Go
Ö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.
Örnek çözümü göster
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"])
}
Kendini test et
-
İşleyiciyi gerçek ağ açmadan test etmenin yolu hangisidir?
- Mümkün değildir
- httptest.NewRecorder + httptest.NewRequest
- http.ListenAndServe
- curl
Cevabı göster
httptest.NewRecorder + httptest.NewRequest — Recorder bir ResponseWriter taklididir; işleyici doğrudan çağrılır ve kod, başlık, gövde bellekten okunur.
-
Kapanış hatası
if err := srv.ListenAndServe(); err != http.____ {
log.Fatal(err)
}
Cevabı göster
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatal(err)
}
-
Grubun özeti
- http.Client{Timeout}
- Güvenli istemci
- ServeMux
- Yönlendirme
- httptest
- Ağsız test
- srv.Shutdown
- Nazik kapanış
Sıradaki ders: flag paketi