Ce face net/url.JoinPath
url.JoinPath("https://api.ro/v1/", "clienti", "42") returnează https://api.ro/v1/clienti/42. Pune exact o bară între segmente, elimină ./ și rezolvă ../, deci nu mai apar adrese ca v1//clienti. Returnează eroare dacă baza nu poate fi desfăcută.
Metoda u.JoinPath(...) face același lucru pe un *url.URL deja desfăcut și returnează un URL nou (cel vechi rămâne neschimbat); parametrii de query ai bazei se păstrează. Segmentele trebuie să fie deja codate: dacă pot conține spații sau /, trece-le prin url.PathEscape.
Parametri
| Parametru | Descriere |
|---|---|
base |
Adresa de bază, ca text (la funcție). |
elem |
Segmentele de adăugat. |
Ce returnează
Funcția: adresa ca text și o eroare. Metoda: un *url.URL nou.
Exemple
Exemplul 1: Adrese de API fără bare duble
package main
import (
"fmt"
"net/url"
)
func main() {
a, _ := url.JoinPath("https://api.magazin.ro/v1/", "/clienti/", "42", "comenzi")
fmt.Println(a)
b, _ := url.JoinPath("https://api.magazin.ro/v1/produse", "../categorii", "./laptopuri")
fmt.Println(b)
c, _ := url.JoinPath("https://dexblog.ro", "tag", url.PathEscape("go și web"))
fmt.Println(c)
_, err := url.JoinPath("://fara-schema", "x")
fmt.Println("Eroare:", err)
}
Rezultat
https://api.magazin.ro/v1/clienti/42/comenzi
https://api.magazin.ro/v1/categorii/laptopuri
https://dexblog.ro/tag/go%20%C8%99i%20web
Eroare: parse "://fara-schema": missing protocol scheme
Exemplul 2: Metoda URL.JoinPath păstrează query-ul
package main
import (
"fmt"
"net/url"
)
func main() {
baza, _ := url.Parse("https://api.meteo.ro/v2?cheie=abc123")
for _, oras := range []string{"iasi", "cluj", "brasov"} {
u := baza.JoinPath("orase", oras, "prognoza")
fmt.Println(u)
}
fmt.Println("Baza neschimbată:", baza)
}
Rezultat
https://api.meteo.ro/v2/orase/iasi/prognoza?cheie=abc123
https://api.meteo.ro/v2/orase/cluj/prognoza?cheie=abc123
https://api.meteo.ro/v2/orase/brasov/prognoza?cheie=abc123
Baza neschimbată: https://api.meteo.ro/v2?cheie=abc123
Greșeli frecvente
- Dai segmente cu spații sau
?necodate:JoinPathnu le codează ca valori, iar un?poate ajunge în query. Codează-le cuurl.PathEscape. - Folosești
path.Joinpe o adresă completă: transformăhttps://înhttps:/.
Comenzi înrudite
net/url.Parse: Desface o adresă URL în părțile ei (schemă, host, cale, query, fragment); String() o reconstruiește.net/url.QueryEscape: QueryEscape codează un text pentru query string (spațiu → +), PathEscape pentru o bucată de cale (spațiu → %20); QueryUnescape decodează.net/http.NewRequest: Construiește o cerere HTTP completă (orice metodă, antete, corp) care se trimite apoi cu Client.Do.