URL编码,也被称为百分比编码,是一种只使用有限的字符集对URL进行编码的方法,这样URL就可以在互联网上安全地传输。在Golang中,我们在net/url 包中有2个基本功能,用于对URL的不同部分进行编码。
url.QueryEscape()对放置在URL查询中的字符串进行编码。url.PathEscape()对放置在URL路径段内的字符串进行编码。路径段的编码与查询不同,例如, 字符在路径中是允许的,而在查询中,它应该被编码。
我们可以通过使用url.URL 结构使这一程序变得简单一些,而不是手动建立URL。我们只需要设置URL的Scheme、Host、Path,并通过在url.Values 结构中对查询参数进行编码来建立RawQuery字符串。
请看例子来比较这两种URL编码的方法。
package main
import (
"fmt"
"net/url"
)
func main() {
// build url manually
host := "https://example.com/"
path := url.PathEscape("foo+bar!")
query1Val := url.QueryEscape("ab+c")
query2Val := url.QueryEscape("de$f")
query := fmt.Sprintf("query=%s&query2=%s", query1Val, query2Val)
fmt.Printf("%-35s %s%s?%s\n", "Manually built URL:", host, path, query)
// build url using url.URL struct
exampleURL := &url.URL{
Scheme: "https",
Host: "example.com",
Path: "/foo+bar!",
}
queryValues := url.Values{}
queryValues.Add("query", "ab+c")
queryValues.Add("query2", "de$f")
exampleURL.RawQuery = queryValues.Encode()
fmt.Printf("%-35s %s\n", "URL built using url.URL struct:", exampleURL)
}
输出
Manually built URL: https://example.com/foo+bar%21?query=ab%2Bc&query2=de%24f
URL built using url.URL struct: https://example.com/foo+bar%21?query=ab%2Bc&query2=de%24f