在Golang中解码一个转义的URL,你可以直接使用解析URL的函数 url.Parse包中的 url包中的解析URL函数。它对URL的所有部分进行解析和解码。
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
// decode URL by url.Parse
parsedURL, err := url.Parse("https://example.com/foo+bar%21?query=ab%2Bc&query2=de%24f")
if err != nil {
log.Fatal(err)
return
}
fmt.Printf("scheme: %s\n", parsedURL.Scheme)
fmt.Printf("host: %s\n", parsedURL.Host)
fmt.Printf("path: %s\n", parsedURL.Path)
fmt.Println("query args:")
for key, values := range parsedURL.Query() {
fmt.Printf(" %s = %s\n", key, values[0])
}
}
结果
scheme: https
host: example.com
path: /foo+bar!
query args:
query = ab+c
query2 = de$f
另外,你可以使用解码和解析URL的不同部分的函数:
url.PathUnescape()- 来解码位于URL路径段内的字符串。路径段的编码与查询不同(例如,+字符在路径中是允许的),所以它需要一个与查询部分不同的方法。url.QueryUnescape()- 对URL查询中的字符串进行解码。url.ParseQuery()- 对URL查询中的字符串进行解码,并将其解析为url.Values地图。
请看例子来比较这些函数。
package main
import (
"fmt"
"log"
"net/url"
)
func main() {
// decode path by url.PathUnescape
path := "foo+bar%21"
unescapedPath, err := url.PathUnescape(path)
if err != nil {
log.Fatal(err)
return
}
fmt.Printf("unescaped path: %s\n", unescapedPath)
// decode query by url.QueryUnescape
query := "query=ab%2Bc&query2=de%24f"
unescapedQuery, err := url.QueryUnescape(query)
if err != nil {
log.Fatal(err)
return
}
fmt.Printf("unescaped query: %s\n", unescapedQuery)
// decode query and parse by url.ParseQuery
parsedQuery, err := url.ParseQuery(query)
if err != nil {
log.Fatal(err)
return
}
fmt.Println("parsed query args:")
for key, values := range parsedQuery {
fmt.Printf(" %s = %s\n", key, values[0])
}
}
结果
unescaped path: foo+bar!
unescaped query: query=ab+c&query2=de$f
parsed query args:
query = ab+c
query2 = de$f