2.9 KiB
2.9 KiB
title, date, draft, tags
title | date | draft | tags | |||||
---|---|---|---|---|---|---|---|---|
Encode URLs in Go | 2020-03-04 | false |
|
The net/url package is a useful package for dealing with URLs, paths and parameters in Go. You can have parameters encoded in a URL or automatically convert special characters.
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)
}
As you can see url.Parse splits the URL into its components and saves it to a structure. In addition to the fields above, there are also others (from the documentation):
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 '#'
}
Working with URLs
Net/url defines a type Values as a key-value pair and offers some methods to work with it.
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)
}
Encode URL paths with special characters
When creating the URL with the parse method, an encoded version of the URL path is also created, so that special characters are not a problem:
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())
}
The package contains even more practical functionality. You can find the documentary at: https://golang.org/pkg/net/