Das Paket net/url ist ein nützliches Paket um in Go mit URLs, Pfaden und Parametern umzugehen. Man kann Parameter in ein URL kodieren lassen oder Sonderzeichen automatisch umwandeln.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
//set the URL
baseUrl, err := url.Parse("https://www.google.com/search")
if err != nil {
log.Fatalln(err)
}
fmt.Printf("URL: %s\n", baseUrl)
fmt.Println(baseUrl.Host)
fmt.Println(baseUrl.Path)
}
|
Code ausprobieren
Wie man wird die URL mit url.Parse in Ihre Bestandteile zerlegt und in einer Struktur gespeichert.
Neben den oben stehenden Feldern gibt es auch noch weitere (Auszug aus der Dokumentation):
1
2
3
4
5
6
7
8
9
10
11
|
type URL struct {
Scheme string
Opaque string // encoded opaque data
User Userinfo // username and password information
Host string // host or host:port
Path string // path (relative paths may omit leading slash)
RawPath string // encoded path hint (see EscapedPath method); added in Go 1.5
ForceQuery bool // append a query ('?') even if RawQuery is empty; added in Go 1.7
RawQuery string // encoded query values, without '?'
Fragment string // fragment for references, without '#'
}
|
Mit URL Parametern arbeiten
Net/url definiert einen Typ Values als Schlüssel-Wertepaar und bietet einige Methoden an um Damit zu arbeiten.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
//parameters
p := url.Values{}
p.Add("q", "cat")
p.Add("s", "something else")
fmt.Println(p)
fmt.Println(p.Encode())
//this also works backwards
q, err := url.ParseQuery("q=cat&s=something+else")
if err != nil {
log.Fatalln(err)
}
fmt.Println(q)
//delete a key
p.Del("q")
fmt.Println(p)
}
|
Code ausprobieren
URL Pfade mit Sonderzeichen kodieren
Beim Erstellen der URL mit der parse Methode wird praktischweise auch ein eine kodierte Fassung des URL Pfades angelegt, so dass Sonderzeichen kein Problem sind:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
//set the URL
baseUrl, err := url.Parse("https://www.google.com/search")
if err != nil {
log.Fatalln(err)
}
//path encoding
baseUrl.Path += "/a path with spaces and special chars!ü@"
fmt.Printf("URL: %s\n", baseUrl)
fmt.Println(baseUrl.Host)
fmt.Println(baseUrl.Path)
fmt.Println(baseUrl.EscapedPath())
//lets try this backwards
newUrl, err := url.ParseRequestURI("https://www.google.com/search/a%20path%20with%20spaces%20and%20special%20chars%21%C3%BC@")
if err != nil {
log.Fatalln(err)
}
fmt.Println(newUrl.Host)
fmt.Println(newUrl.Path)
fmt.Println(baseUrl.EscapedPath())
}
|
Das Paket hat noch mehr praktische Funktion. Die Doku findet Ihr unter: https://golang.org/pkg/net/