Özet - net/http
- Go kursu
- Orta seviye
- Ders 70/80
- 4 dk
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
package main
import (
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
)
func main() {
// buraya yaz
}Örnek çözüm
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ı
if err := srv.ListenAndServe(); err != http.____ {
log.Fatal(err)
}
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ış |