Câte un handler pentru fiecare rută
Rutarea decide care handler răspunde la care cerere. Routerul inclus în Go este http.ServeMux: tu înregistrezi tipare, iar el distribuie cererile.
Tiparele pot include metoda și parametrii de cale între acolade: "GET /users/{id}" se potrivește cu GET /users/7 și îți dă valoarea 7 prin r.PathValue("id"). Framework-urile adaugă facilități peste acest mecanism, dar el acoperă nevoile de zi cu zi chiar din start.
Rute și valori de cale
Două rute: lista la /users și un singur utilizator la /users/{id}. Partea dintre acolade este parametrul de cale — bucata din URL care reprezintă date.
O rută cu un parametru de cale
Același mux trimite /users către un handler și /users/7 către altul, iar r.PathValue("id") extrage valoarea 7 fără nicio tăiere de șiruri de caractere.
Ieșire: program Go și rezultatul capturat
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /users", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "toți utilizatorii: Ana, Ben, Cleo")
})
mux.HandleFunc("GET /users/{id}", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "un singur utilizator, id =", r.PathValue("id"))
})
server := httptest.NewServer(mux)
defer server.Close()
for _, path := range []string{"/users", "/users/7"} {
resp, _ := http.Get(server.URL + path)
body, _ := io.ReadAll(resp.Body)
resp.Body.Close()
fmt.Print("GET ", path, " -> ", string(body))
}
}
Parametri de interogare
Partea de după ? conține parametrii de interogare — opțiuni pentru cerere, cum ar fi un text de căutat sau o limită: /search?q=go&limit=2. Ei vin din r.URL.Query(), întotdeauna ca șiruri de caractere, iar Get returnează "" pentru cei care lipsesc.
Regula de bază: calea spune care resursă, interogarea spune cum — filtre, sortare, paginare.
Citirea șirului de interogare
Handlerul citește q și limit din interogare. A doua cerere omite limit, așa că handlerul folosește o valoare implicită — parametrii care lipsesc sunt ceva normal, așa că pregătește-te pentru ei.
Ieșire: program Go și rezultatul capturat
package main
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /search", func(w http.ResponseWriter, r *http.Request) {
q := r.URL.Query().Get("q")
limit := r.URL.Query().Get("limit")
if limit == "" {
limit = "10"
}
fmt.Fprintln(w, "caut", q, "cu limita", limit)
})
server := httptest.NewServer(mux)
defer server.Close()
for _, path := range []string{"/search?q=go&limit=2", "/search?q=json"} {
resp, _ := http.Get(server.URL + path)
body, _ := io.ReadAll(resp.Body)
resp.Body.Close()
fmt.Print("GET ", path, " -> ", string(body))
}
}