net/http ile istemci
- Go kursu
- Orta seviye
- Ders 65/80
- 4 dk
http.Client ile HTTP isteği yapmayı öğrenirsin.
net/http ile istemci
net/http hem istemci hem sunucu içerir. İstemci tarafında üç adım vardır: isteği oluştur, gönder, yanıtı işle ve gövdeyi kapat.
req, err := http.NewRequestWithContext(ctx, "GET", "https://api.ornek.com/urunler", nil)
if err != nil { return err }
req.Header.Set("Accept", "application/json")
resp, err := istemci.Do(req)
if err != nil { return err }
defer resp.Body.Close()http.DefaultClient'ın zaman aşımı yoktur; üretimde &http.Client{Timeout: 10 * time.Second} gibi kendi istemcini oluştur.
Gövdeyi kapat
resp.Body kapatılmazsa TCP bağlantısı havuza dönmez; zamanla bağlantılar tükenir. Gövdeyi okumadan kapatmak da bağlantının yeniden kullanılmasını engelleyebilir; tümünü okumak ya da io.Copy(io.Discard, resp.Body) ile boşaltmak en iyisidir. Büyük yanıtlar için io.LimitReader ile okuma sınırla.
Uygulama Test sunucusuna istek
httptest.NewServer ile "pong" yazan bir sunucu başlat (defer srv.Close()). Zaman aşımlı bir http.Client ile srv.URL'e GET at, gövdeyi io.ReadAll ile oku ve durum kodu ile gövdeyi yazdır.
Başlangıç kodu
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"time"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"time"
)
func main() {
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "pong")
}))
defer srv.Close()
istemci := &http.Client{Timeout: 5 * time.Second}
resp, err := istemci.Get(srv.URL)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
b, _ := io.ReadAll(resp.Body)
fmt.Println(resp.StatusCode, string(b))
}Beklenen çıktı
200 pong
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Sunucu 404 döndürdüğünde <code>client.Do</code> ne döner?
- panic
- Boş gövde ve error
- Yanıt ve nil error; kodu resp.StatusCode ile kontrol etmelisin Doğru cevap
- nil yanıt ve error
Açıklama: Do yalnızca ağ/protokol hatalarında error döner; 4xx ve 5xx geçerli HTTP yanıtlarıdır.
2 Gövdeyi kapat
resp, err := istemci.Do(req)
if err != nil { return err }
____ resp.Body.Close()
resp, err := istemci.Do(req)
if err != nil { return err }
defer resp.Body.Close()
Açıklama: defer resp.Body.Close() bağlantının havuza geri dönmesini sağlar.
3 İstemci adımı
| Kavram | Anlamı |
|---|---|
NewRequestWithContext |
İstek ve iptal |
req.Header.Set |
Başlık ekler |
client.Do |
Gönderir |
resp.StatusCode |
Sonuç kodu |