Serverul te apelează pe tine
Un server web în Go este construit din handlere: funcții cu forma func(w http.ResponseWriter, r *http.Request). Serverul acceptă conexiunile și îți apelează handlerul o dată pentru fiecare cerere — r conține tot ce ține de cerere, iar tot ce scrii în w devine răspunsul.
Un server real pornește cu http.ListenAndServe(":8080", mux) și rulează la nesfârșit. Exemplele de aici folosesc în schimb httptest.NewServer — un server real pe un port liber ales aleatoriu, pe care programul îl poate porni, folosi și opri, astfel încât fiecare exemplu rulează și se încheie singur.
Un prim handler
Cel mai mic handler posibil scrie o linie de text. Tot ce face un API — JSON, coduri de stare, rutare — se întâmplă în interiorul aceleiași forme de funcție.
Salut de la un handler
Handlerul scrie în w; clientul citește exact acest lucru ca fiind corpul răspunsului, cu starea 200 OK completată automat.
Ieșire: program Go și rezultatul capturat
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
)
func hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "salut de la server")
}
func main() {
server := httptest.NewServer(http.HandlerFunc(hello))
defer server.Close()
resp, _ := http.Get(server.URL + "/")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println("stare:", resp.Status)
fmt.Print("corp: ", string(body))
}
Răspunsul în format JSON
Un handler de API face trei lucruri: setează antetul Content-Type, alege un cod de stare și codifică datele. json.NewEncoder(w).Encode(value) scrie JSON direct în răspuns.
Ordinea contează: antetele trebuie setate înainte ca corpul să fie scris.
Un endpoint JSON
Handlerul codifică o structură direct în writerul răspunsului. Clientul primește JSON valid și tipul de conținut corect — acesta este scheletul fiecărui endpoint din restul acestui grup.
Ieșire: program Go și rezultatul capturat
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/http/httptest"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func userHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(User{ID: 1, Name: "Ana"})
}
func main() {
server := httptest.NewServer(http.HandlerFunc(userHandler))
defer server.Close()
resp, _ := http.Get(server.URL + "/user")
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println("stare:", resp.Status)
fmt.Println("tip: ", resp.Header.Get("Content-Type"))
fmt.Print("corp: ", string(body))
}