net/url.JoinPath în Go

Adaugă segmente la calea unei adrese, cu exact o bară între ele și fără ./ sau ../; varianta metodă lucrează pe *URL.

Sintaxă
func JoinPath(base string, elem ...string) (result string, err error)
func (u *URL) JoinPath(elem ...string) *URL

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: JoinPath nu le codează ca valori, iar un ? poate ajunge în query. Codează-le cu url.PathEscape.
  • Folosești path.Join pe o adresă completă: transformă https:// în https:/.

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.