net/url.QueryEscape în Go

QueryEscape codează un text pentru query string (spațiu → +), PathEscape pentru o bucată de cale (spațiu → %20); QueryUnescape decodează.

Sintaxă
func QueryEscape(s string) string
func QueryUnescape(s string) (string, error)
func PathEscape(s string) string   // Go 1.8

Ce face net/url.QueryEscape

În adrese, anumite caractere au rol special (?, &, =, /, #), iar spațiile și diacriticele nu sunt permise direct. Ele se scriu codat: % urmat de valoarea octetului în hexazecimal. url.QueryEscape("cafea & ceai") dă cafea+%26+ceai, potrivit ca valoare după ?q=.

url.PathEscape codează pentru un segment de cale: spațiul devine %20 (nu +) și / devine %2F. url.QueryUnescape face drumul invers și returnează eroare pentru secvențe invalide; pentru căi există url.PathUnescape.

Când lucrezi cu mai mulți parametri, url.Values.Encode codează automat tot; funcțiile acestea sunt pentru o singură valoare.

Parametri

Parametru Descriere
s Textul de codat sau de decodat.

Ce returnează

Textul codat; QueryUnescape returnează și o eroare.

Exemple

Exemplul 1: Diferența dintre QueryEscape și PathEscape

package main

import (
	"fmt"
	"net/url"
)

func main() {
	texte := []string{"cafea & ceai", "Iași/Copou", "100% bumbac", "a+b=c?"}
	for _, t := range texte {
		fmt.Printf("%-14s query: %-22s path: %s\n", t, url.QueryEscape(t), url.PathEscape(t))
	}
	cautare := "pantofi mărimea 38"
	fmt.Println("https://magazin.ro/cauta?q=" + url.QueryEscape(cautare))
	fmt.Println("https://magazin.ro/tag/" + url.PathEscape("încălțăminte sport"))
}

Rezultat

cafea & ceai   query: cafea+%26+ceai         path: cafea%20&%20ceai
Iași/Copou     query: Ia%C8%99i%2FCopou      path: Ia%C8%99i%2FCopou
100% bumbac    query: 100%25+bumbac          path: 100%25%20bumbac
a+b=c?         query: a%2Bb%3Dc%3F           path: a+b=c%3F
https://magazin.ro/cauta?q=pantofi+m%C4%83rimea+38
https://magazin.ro/tag/%C3%AEnc%C4%83l%C8%9B%C4%83minte%20sport

Exemplul 2: Decodare cu QueryUnescape

package main

import (
	"fmt"
	"net/url"
)

func main() {
	for _, codat := range []string{"Ana+Maria", "Ia%C8%99i", "50%25+reducere", "gresit%G1"} {
		text, err := url.QueryUnescape(codat)
		if err != nil {
			fmt.Printf("%-16s eroare: %v\n", codat, err)
			continue
		}
		fmt.Printf("%-16s -> %s\n", codat, text)
	}
}

Rezultat

Ana+Maria        -> Ana Maria
Ia%C8%99i        -> Iași
50%25+reducere   -> 50% reducere
gresit%G1        eroare: invalid URL escape "%G1"

Greșeli frecvente

  • Folosești QueryEscape pentru o bucată de cale: spațiile devin +, iar în cale + înseamnă chiar plus. Folosește PathEscape.
  • Codezi o valoare de două ori (o dată tu, o dată url.Values.Encode): % devine %25 și serverul primește text stricat.

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.JoinPath: Adaugă segmente la calea unei adrese, cu exact o bară între ele și fără ./ sau ../; varianta metodă lucrează pe *URL.
  • net/url.Parse: Desface o adresă URL în părțile ei (schemă, host, cale, query, fragment); String() o reconstruiește.