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 luierr: dacăerr != nil,respestenilș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 unhttp.ClientcuTimeout.
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.