How to perform URL decoding in Golang
3 minsIn this article, you’ll learn how to URL decode query strings or form parameters in Golang. URL Decoding is the inverse operation of URL encoding. It converts the encoded characters back to their normal form.
URL Decoding a Query string in Golang
Go’s net/url
package contains a built-in method called QueryUnescape
to unescape/decode a string. The following example shows how to decode a query string in Golang -
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
encodedValue := "Hell%C3%B6+W%C3%B6rld%40Golang"
decodedValue, err := url.QueryUnescape(encodedValue)
if err != nil {
log.Fatal(err)
return
}
fmt.Println(decodedValue)
}
# Output
Hellö Wörld@Golang
Parsing a URL encoded query string of the form ("param1=value1¶m2=value2"
)
You can use url.ParseQuery()
method to parse a series of key=value
pairs separated by &
into a map[string][]string
-
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
queryStr := "name=Rajeev%20Singh&phone=%2B9199999999&phone=%2B628888888888"
params, err := url.ParseQuery(queryStr)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("Query Params: ")
for key, value := range params {
fmt.Printf(" %v = %v\n", key, value)
}
}
# Output
Query Params:
name = [Rajeev Singh]
phone = [+9199999999 +628888888888]
URL Decoding a Path Segment in Golang
PathUnescape()
function is identical to QueryUnescape()
except that it does not unescape plus sign (+
) to space(" "
) because plus sign is allowed in the path segment of a URL. It is a special character only in the query component.
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
path := "path%20with%3Freserved+characters"
unescapedPath, err := url.PathUnescape(path)
if err != nil {
log.Fatal(err)
}
fmt.Println(unescapedPath)
}
# Output
path with?reserved+characters
Parsing a complete URL in Golang
Finally, Let’s see a complete example of URL parsing in Golang -
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
u, err := url.Parse("https://www.website.com/person?name=Rajeev%20Singh&phone=%2B919999999999&phone=%2B628888888888")
if err != nil {
log.Fatal(err)
return
}
fmt.Println("Scheme: ", u.Scheme)
fmt.Println("Host: ", u.Host)
queries := u.Query()
fmt.Println("Query Strings: ")
for key, value := range queries {
fmt.Printf(" %v = %v\n", key, value)
}
fmt.Println("Path: ", u.Path)
}
# Output
Scheme: https
Host: www.website.com
Query Strings:
phone = [+919999999999 +628888888888]
name = [Rajeev Singh]
Path: /person
Also Read: How to URL Encode a String in Golang