Go offre un supporto eccellente per lavorare con richieste HTTP grazie al suo pacchetto net/http. In questo articolo vediamo come effettuare richieste GET e POST utilizzando esclusivamente i package inclusi nella libreria standard di Go.
Effettuare una richiesta GET
Per inviare una richiesta GET, possiamo utilizzare la funzione http.Get. Ecco un esempio:
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
resp, err := http.Get("https://example.com")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
Nel codice sopra:
- Chiamiamo
http.Getcon l'URL desiderato. - Controlliamo eventuali errori e ricordiamo di chiudere il body della risposta con
defer. - Usiamo
io.ReadAllper leggere tutto il contenuto della risposta.
Effettuare una richiesta POST
Per inviare dati con una richiesta POST, possiamo utilizzare http.Post oppure creare manualmente una richiesta con http.NewRequest. Ecco un esempio semplice con http.Post:
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
data := []byte(`{"name":"John","age":30}`)
resp, err := http.Post("https://example.com/api", "application/json", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
Qui:
- Prepariamo i dati da inviare come JSON.
- Chiamiamo
http.Postspecificando URL, tipo di contenuto e body. - Leggiamo e stampiamo la risposta come nel caso della GET.
Gestire richieste personalizzate
Per maggiore controllo, possiamo creare manualmente una richiesta usando http.NewRequest e inviarla con http.Client:
package main
import (
"bytes"
"fmt"
"io"
"net/http"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("PUT", "https://example.com/resource", bytes.NewBuffer([]byte(`{"update":"true"}`)))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println(string(body))
}
Questo approccio consente di:
- Specificare il metodo HTTP (come PUT, PATCH, DELETE).
- Aggiungere intestazioni personalizzate.
- Utilizzare un
http.Clientpersonalizzato.
Conclusione
Con il pacchetto net/http e le funzioni di io, Go rende semplice inviare richieste HTTP in modo robusto e performante, senza dover ricorrere a librerie esterne.