CodeBlanks Logo Icon CodeBlanks

net/http ile istemci

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

main.go
package main

import (
    "fmt"
    "io"
    "net/http"
    "net/http/httptest"
    "time"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
resp, err := istemci.Do(req)
if err != nil { return err }
____ resp.Body.Close()
Cevap
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

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