net/http.Get în Go

Trimite o cerere GET (sau HEAD, doar antete) la adresa dată și returnează răspunsul; corpul trebuie închis.

Sintaxă
func Get(url string) (resp *Response, err error)
func Head(url string) (resp *Response, err error)

Ce face net/http.Get

http.Get(url) este cel mai simplu mod de a descărca o pagină sau de a apela un API. Folosește clientul implicit (http.DefaultClient), urmează automat până la 10 redirecționări și returnează un *http.Response. http.Head(url) trimite o cerere HEAD: serverul răspunde doar cu antetele, fără corp, util pentru a verifica dacă o adresă există sau cât de mare este un fișier.

Atenție: un cod de eroare HTTP (404, 500) nu produce err. err apare doar când nu există răspuns deloc (adresă greșită, server oprit, fără internet). Verifică întotdeauna și resp.StatusCode.

Corpul răspunsului (resp.Body) trebuie închis cu defer resp.Body.Close(), altfel conexiunea nu poate fi refolosită. Clientul implicit nu are limită de timp; pentru programe reale creează un http.Client{Timeout: ...} sau folosește un context.

Parametri

Parametru Descriere
url Adresa completă, cu http:// sau https://.

Ce returnează

Răspunsul (*http.Response) și o eroare. Dacă err == nil, resp.Body trebuie închis.

Exemple

Exemplul 1: Citirea unui API local

package main

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

func main() {
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path != "/curs" {
			http.NotFound(w, r)
			return
		}
		w.Header().Set("Content-Type", "application/json")
		fmt.Fprint(w, `{"EUR": 4.97, "USD": 4.58}`)
	}))
	defer srv.Close()

	for _, cale := range []string{"/curs", "/inexistent"} {
		resp, err := http.Get(srv.URL + cale)
		if err != nil {
			fmt.Println("eroare de rețea:", err)
			return
		}
		corp, err := io.ReadAll(resp.Body)
		resp.Body.Close()
		if err != nil {
			fmt.Println(err)
			return
		}
		if resp.StatusCode != http.StatusOK {
			fmt.Println(cale, "-> eroare HTTP:", resp.Status)
			continue
		}
		fmt.Println(cale, "->", string(corp))
	}
}

Rezultat

/curs -> {"EUR": 4.97, "USD": 4.58}
/inexistent -> eroare HTTP: 404 Not Found

Exemplul 2: HEAD: doar antetele

package main

import (
	"fmt"
	"net/http"
	"net/http/httptest"
	"strings"
)

func main() {
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/pdf")
		fmt.Fprint(w, strings.Repeat("x", 2048)) // un „PDF” de 2048 de octeți
	}))
	defer srv.Close()

	resp, err := http.Head(srv.URL + "/catalog.pdf")
	if err != nil {
		fmt.Println(err)
		return
	}
	resp.Body.Close()
	fmt.Println("Status:", resp.Status)
	fmt.Println("Tip:", resp.Header.Get("Content-Type"))
	fmt.Println("Mărime:", resp.ContentLength, "octeți")
}

Rezultat

Status: 200 OK
Tip: application/pdf
Mărime: 2048 octeți

Exemplul 3: Pagină reală de pe internet

Exemplul are nevoie de internet, deci nu este rulat la generarea paginii.

package main

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

func main() {
	resp, err := http.Get("https://go.dev/VERSION?m=text")
	if err != nil {
		fmt.Println("eroare:", err)
		return
	}
	defer resp.Body.Close()
	corp, _ := io.ReadAll(resp.Body)
	fmt.Println(resp.Status)
	fmt.Printf("%s\n", corp)
}

Rezultat posibil (diferă la fiecare rulare)

200 OK
go1.27.2
time 2026-10-07T17:01:12Z

Greșeli frecvente

  • Verifici doar err și tratezi un 404 sau 500 ca pe un succes. Verifică resp.StatusCode.
  • Uiți resp.Body.Close(): conexiunile rămân deschise și, după multe cereri, programul rămâne fără ele.
  • Pui defer resp.Body.Close() înainte de verificarea lui err: dacă err != nil, resp este nil și programul se oprește cu panică.
  • Folosești http.Get într-un serviciu de producție: fără limită de timp, un server care nu răspunde blochează programul. Folosește un http.Client cu Timeout.

Comenzi înrudite

  • net/http.Client: Clientul HTTP configurabil (limită de timp, redirecționări, cookie-uri); Do trimite o cerere, Get o cerere GET.
  • net/http.Response: Răspunsul primit de client: codul de stare (StatusCode, Status), antetele (Header) și corpul (Body), care trebuie închis.
  • net/http.Post: Post trimite date (ex. JSON) cu tipul de conținut dat; PostForm trimite un formular codat ca application/x-www-form-urlencoded.
  • net/http.NewRequest: Construiește o cerere HTTP completă (orice metodă, antete, corp) care se trimite apoi cu Client.Do.