返回介绍

上卷 程序设计

中卷 标准库

下卷 运行时

源码剖析

附录

url

发布于 2024-10-12 19:15:53 字数 2195 浏览 0 评论 0 收藏 0

统一资源定位符(URL)格式:

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
http://example.com:80/path/to/my.html?k1=v1&k2=v2#some
~~~~   ~~~~~~~~~~~ ~~ ~~~~~~~~~~~~~~~ ~~~~~~~~~~~ ~~~~
 1          2      3        4              5        6
 
 1: 协议 protocol(http/https/ftp/file)
 2: 域名 domain
 3: 端口 port
 4: 路径 path
 5: 参数 query
 6: 锚点 fragment(片段标识符,element id/name)

分解函数 ParseParseRequestURI 的区别在于,前者能正确处理 #fragment 信息。

func main() {
	s := "http://localhost:8080/a.html?x=1#bottom"

	u, _ := url.Parse(s)
	u2, _ := url.ParseRequestURI(s)

	fmt.Printf("%#v\n%#v\n", u, u2)
}

/*

{
    Scheme:"http", 
    Host:"localhost:8080", 
    Path:"/a.html", 
    RawQuery:"x=1", 
    Fragment:"bottom", 
}

{
    Scheme:"http", 
    Host:"localhost:8080", 
    Path:"/a.html", 
    RawQuery:"x=1#bottom", 
    Fragment:"", 
}

*/

相关方法都能自动完成编码处理,也可调用 PathUnescapeQueryUnescape 手工进行。

func main() {
    r := "http://localhost:8080/%E6%B5%8B%E8%AF%95.html?x=%E6%95%B0%E6%8D%AE"
	u, _ := url.Parse(r)
    
	fmt.Printf("%#v\n", u)
	fmt.Printf("%#v\n", u.Query())
    fmt.Println(url.QueryEscape("数据"))
}

/*

{
    Scheme:"http", 
    Opaque:"", 
    User:(*url.Userinfo)(nil), 
    Host:"localhost:8080", 
    Path:"/测试.html", 
    RawPath:"", 
    ForceQuery:false, 
    RawQuery:"x=%E6%95%B0%E6%8D%AE", 
    Fragment:"", 
    RawFragment:""
}

url.Values {
    "x":[]string{"数据"}
}

%E6%95%B0%E6%8D%AE

*/

允许有多个同名参数。

type Values map[string][]string
func main() {
	u, _ := url.Parse("/a.html?x=1&y=2&x=abc")
	v := u.Query()

	fmt.Printf("%#v\n", v)
    
	fmt.Println(v.Get("x"))  // 第一个。
	fmt.Println(v["x"])
}

// {"x":[]string{"1", "abc"}, "y":[]string{"2"}}
// 1
// [1 abc]

构建一个 URL 也很容易。

func main() {
	u := url.URL{
		Scheme   : "https",
		Host     : "abc.com:80",
		Path     : "/测试.html",
		RawQuery : url.Values{
			"x": {"1", "abc"},
			"y": {"我们"},
        }.Encode(),
	}

	fmt.Println(u.String())
}

/* 

https://abc.com:80/%E6%B5%8B%E8%AF%95.html?x=1&x=abc&y=%E6%88%91%E4%BB%AC

*/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文