Photo By: https://picjumbo.com/author/viktorhanacek/
URL编码也称为 Percent encode(%),将不可打印、保留或非ASCII字符的字符串转换为可以在Internet上传输的通用格式。
下面是几种Go语言实现的URL编码方案
Go的net/url程序包包含一个内置方法QueryEscape,该方法称为转义/编码字符串,以便可以将其安全地放置在URL查询中。以下示例演示了如何在Golang中编码查询字符串
package main import { "fmt" "net/url" } func main() { query := "Hello 中国" fmt.Println(url.QueryEscape(query)) }输出
Hello+%E4%B8%AD%E5%9B%BD如果要一次编码多个查询参数,则可以创建一个url.Values由Query param到value映射组成的结构,并使用该url.Values.Encode()方法对所有查询param进行编码。下面的示例演示
package main import ( "fmt" "net/url" ) func main() { params := url.Values{} params.Add("name", "中国") params.Add("phone", "+8613000000000") fmt.Println(params.Encode()) }输出
fmt.Println(params.Encode())就像一样QueryEscape,net/urlGo中的程序包还具有另一个PathEscape()用于编码字符串的函数,以便可以将其安全地放置在URL的路径段中,此方法会把空格编码为%20
package main import ( "fmt" "net/url" ) func main() { path := "Hello 中国+" fmt.Println(url.PathEscape(path)) }输出
Hello%20%E4%B8%AD%E5%9B%BD+可以通过对URL的不同部分进行不同方式的编码构建完整的URL,下面是一个完整的实例
package main import ( "fmt" "net/url" ) func main() { baseUrl, err := url.Parse("http://www.test.com") if err != nil { fmt.Println("Malformed URL: ", err.Error()) return } // add Path Segment baseUrl.Path = "subpath? reversed character" // prepare query parameters params := url.Values{} params.Add("q", "中国") params.Add("u", "+86-13000000000") // add Query Parameters to the URL baseUrl.RawQuery = params.Encode() fmt.Printf("Encode URL is %q\n", baseUrl.String()) }