http.Client
Pentru a efectua cereri HTTP, se poate folosi și structura http.Client. Pentru a trimite o cerere către o resursă web, se poate utiliza una dintre metodele sale:
func (c *Client) Do(req *Request) (*Response, error)
func (c *Client) Get(url string) (resp *Response, err error)
func (c *Client) Head(url string) (resp *Response, err error)
func (c *Client) Post(url string, contentType string, body io.Reader) (resp *Response, err error)
func (c *Client) PostForm(url string, data url.Values) (resp *Response, err error)
Acestea sunt în mare parte echivalente cu funcțiile omonime (cu excepția metodei Do) definite în pachetul net/http și care au fost discutate în tema anterioară. De exemplu, pentru a efectua o cerere GET simplă:
package main
import (
"fmt"
"net/http"
"io"
"os"
)
func main() {
client := http.Client{}
resp, err := client.Get("https://google.com")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
}
Configurarea clientului
Structura http.Client are mai multe câmpuri care permit configurarea comportamentului său:
- Timeout: setează timeout-ul pentru cerere
- Jar: setează cookie-urile trimise în cerere
- Transport: definește mecanismul de execuție a cererii
Exemplu de setare a timeout-ului:
package main
import (
"fmt"
"net/http"
"io"
"os"
"time"
)
func main() {
client := http.Client{
Timeout: 6 * time.Second,
}
resp, err := client.Get("https://google.com")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
}
Proprietatea Timeout reprezintă un obiect time.Duration, și în acest caz, este setat la 6 secunde.
Request
Pentru a gestiona cererea și parametrii săi în Go se folosește obiectul http.Request. Acesta permite setarea diverselor configurații, adăugarea de cookie-uri, antete și definirea corpului cererii. Pentru a crea un obiect http.Request, se utilizează funcția http.NewRequest():
func NewRequest(method, url string, body io.Reader) (*Request, error)
Funcția primește trei parametri. Primul parametru este tipul cererii sub forma unui șir de caractere ("GET", "POST"). Al doilea parametru este adresa resursei. Al treilea parametru este corpul cererii.
Pentru a trimite obiectul Request, se poate utiliza metoda Do():
Do(req *http.Request) (*http.Response, error)
De exemplu:
package main
import (
"fmt"
"net/http"
"io"
"os"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest(
"GET", "https://google.com", nil,
)
// adăugăm antete
req.Header.Add("Accept", "text/html") // adăugăm antetul Accept
req.Header.Add("User-Agent", "MSIE/15.0") // adăugăm antetul User-Agent
resp, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
io.Copy(os.Stdout, resp.Body)
}