net/url.URL.Query în Go

Desface partea de după „?” a unei adrese într-un url.Values (map de la nume la valori).

Sintaxă
func (u *URL) Query() Values

Ce face net/url.URL.Query

u.Query() citește u.RawQuery (de exemplu q=go+json&pagina=2), decodează valorile și returnează un url.Values. Valorile se citesc cu Get; un parametru care apare de mai multe ori are toate valorile în slice-ul lui.

Rezultatul este o copie: dacă modifici valorile, adresa nu se schimbă până nu scrii înapoi u.RawQuery = q.Encode(). Perechile greșit codate sunt ignorate în tăcere; dacă vrei eroarea, folosește url.ParseQuery(u.RawQuery). Pe server, r.URL.Query() citește parametrii unei cereri.

Ce returnează

Un url.Values nou.

Exemple

Exemplul 1: Parametrii unei căutări

package main

import (
	"fmt"
	"net/url"
)

func main() {
	u, _ := url.Parse("https://magazin.ro/cauta?q=cafea+boabe&pret_max=80&culoare=negru&culoare=maro")
	q := u.Query()
	fmt.Println("Căutare: ", q.Get("q"))
	fmt.Println("Preț max:", q.Get("pret_max"))
	fmt.Println("Culori:  ", q["culoare"])
	fmt.Println("Pagina:  ", q.Get("pagina") == "", "(lipsește)")
}

Rezultat

Căutare:  cafea boabe
Preț max: 80
Culori:   [negru maro]
Pagina:   true (lipsește)

Exemplul 2: Schimbarea unui parametru

Modificăm copia și o scriem înapoi în RawQuery; Encode sortează cheile.

package main

import (
	"fmt"
	"net/url"
)

func paginaUrmatoare(adresa string) string {
	u, err := url.Parse(adresa)
	if err != nil {
		return ""
	}
	q := u.Query()
	q.Set("pagina", "3")
	u.RawQuery = q.Encode()
	return u.String()
}

func main() {
	fmt.Println(paginaUrmatoare("https://dexblog.ro/cauta?q=go&pagina=2"))
	fmt.Println(paginaUrmatoare("https://dexblog.ro/arhiva"))
}

Rezultat

https://dexblog.ro/cauta?pagina=3&q=go
https://dexblog.ro/arhiva?pagina=3

Greșeli frecvente

  • Modifici u.Query() și te aștepți ca adresa să se schimbe. Este o copie; scrie u.RawQuery = q.Encode().
  • Folosești u.Query() într-o buclă strânsă pe aceeași adresă: o desface de fiecare dată. Păstrează rezultatul într-o variabilă.

Comenzi înrudite

  • net/url.Values: Parametrii unui query string sau ai unui formular: Get, Set, Add, Del, Has și Encode (codare sortată după cheie).
  • net/url.ParseQuery: Desface un text de forma a=1&b=2 într-un url.Values și raportează prima eroare de codare.
  • net/url.Parse: Desface o adresă URL în părțile ei (schemă, host, cale, query, fragment); String() o reconstruiește.
  • net/http.Request.FormValue: FormValue citește un câmp dintr-un formular sau din query string; ParseForm le citește pe toate în r.Form și r.PostForm.