MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Trimiterea cererilor prin HTTP

Un domeniu special al utilizării limbajului Go îl reprezintă cererile prin protocolul HTTP. Protocolul HTTP funcționează deasupra TCP, iar tehnic putem scrie o aplicație care acceptă sau trimite cereri prin protocolul TCP și astfel să trimitem și să primim cereri și prin protocolul HTTP. Totuși, având în vedere că acest protocol și, în general, domeniul web joacă un rol important, toate funcțiile corespunzătoare pentru lucrul cu HTTP au fost extrase într-un pachet separat, net/http.

Pentru trimiterea cererilor, în pachetul net/http sunt definite mai multe funcții:

func Get(url string) (resp *Response, err error)
func Head(url string) (resp *Response, err error)
func Post(url string, contentType string, body io.Reader) (resp *Response, err error)
func PostForm(url string, data url.Values) (resp *Response, err error)
  • Get(): trimite o cerere GET
  • Head(): trimite o cerere HEAD
  • Post(): trimite o cerere POST
  • PostForm(): trimite un formular într-o cerere POST

Să luăm în considerare executarea unei cereri foarte simple - cererea GET, pentru care se folosește metoda omonimă:

package main
import (
    "fmt"
    "net/http"
)

func main() {
    resp, err := http.Get("https://google.com") 
    if err != nil { 
        fmt.Println(err) 
        return
    } 
    defer resp.Body.Close()

    for true {
        bs := make([]byte, 1014)
        n, err := resp.Body.Read(bs)
        fmt.Println(string(bs[:n]))
         
        if n == 0 || err != nil{
            break
        }
    }
}

Metoda Get() primește ca parametru adresa resursei către care trebuie făcută cererea și returnează un obiect *http.Response, care încorporează răspunsul. Câmpul Body al structurii http.Response reprezintă răspunsul de la resursa web și, de asemenea, reprezintă interfața io.ReadCloser. Asta înseamnă că acest câmp este, de fapt, un flux de citire și putem citi datele primite folosind metoda Read. În plus, pentru a închide fluxul, trebuie să apelăm metoda Close. Prin urmare, după cerere se apelează metoda defer resp.Body.Close() și într-un ciclu citim datele folosind metoda Read și le afișăm pe consolă.

Având în vedere că, în acest caz, răspunsul de la resursa web este oricum afișat pe consolă, putem simplifica codul astfel:

package main
import (
    "fmt"
    "net/http"
    "io"
    "os"
)

func main() {
   resp, err := http.Get("https://google.com") 
   if err != nil { 
         fmt.Println(err) 
         return
   } 
   defer resp.Body.Close() 
   io.Copy(os.Stdout, resp.Body)
}

În acest caz, cererea GET către https://google.com este trimisă și datele primite sunt copiate direct în os.Stdout, care reprezintă fluxul standard de ieșire, adică consola.