go url解析 详解

package main

import (
	"fmt"
	"net/url"
	"strings"
)

func main() {
	Url := "https://root:[email protected]:0000/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff"
	//Parse函数解析Url为一个URL结构体,Url可以是绝对地址,也可以是相对地址
	//	type URL struct {
	//    Scheme   string
	//    Opaque   string    // 编码后的不透明数据
	//    User     *Userinfo // 用户名和密码信息
	//    Host     string    // host或host:port
	//    Path     string
	//    RawQuery string // 编码后的查询字符串,没有'?'
	//    Fragment string // 引用的片段(文档位置),没有'#'
	//}
	u, err := url.Parse(Url)
	if err == nil {
		fmt.Println(u)  // output: https://root:[email protected]:0000/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff
	}
	
	//ParseRequestURI函数解析Url为一个URL结构体,本函数会假设Url是在一个HTTP请求里,
	//	因此会假设该参数是一个绝对URL或者绝对路径,并会假设该URL没有#fragment后缀
	u1, err := url.ParseRequestURI(Url)
	if err == nil {
		fmt.Println(u1)  // output: https://root:[email protected]:0000/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff
	}

	//得到Scheme
	fmt.Println(u.Scheme)  	// output: https

	//User 包含认证信息 username and password
	user := u.User
	fmt.Println(user)  // output: root:123456
	username := user.Username()
	fmt.Println(username)  // output: root
	password, b := user.Password()
	fmt.Println(password, b)  // output: 123456 true

	//Host 包括主机名和端口信息,如过有端口,用strings.Split() 从Host中手动提取端口
	host := u.Host
	fmt.Println(host)  // output: www.baidu.com:0000
	ho := strings.Split(host, ":")
	fmt.Println("主机名:", ho[0]) // output: 主机名: www.baidu.com
	fmt.Println("端口号:", ho[1])  // output: 端口号: 0000

	//获取path
	path := u.Path
	fmt.Println(path)  // output: /login

	//获取参数 将查询参数解析为一个map。 map以查询字符串为键,对应值字符串切片为值。
	fmt.Println(u.RawQuery)  // output: name=xiaoming&name=xiaoqing&age=24&age1=23
	urlParam := u.RawQuery
	fmt.Println("urlParam:", urlParam)  // output: urlParam: name=xiaoming&name=xiaoqing&age=24&age1=23
	m, err := url.ParseQuery(urlParam)
	if err == nil {
		fmt.Println(m)  // output: map[name:[xiaoming xiaoqing] age:[24] age1:[23]]
		for k, v := range m {
			fmt.Println(k, v)
			/* output: name [xiaoming xiaoqing]
						age [24]
						age1 [23] */
		}
	}

	//与ParseQuery功能一样,只是将上边的方法分装了一下
	m1 := u.Query()
	fmt.Println(m1)  // output: map[age:[24] age1:[23] name:[xiaoming xiaoqing]]
	for k, v := range m1 {
		fmt.Println(k, v)
		/* output: name [xiaoming xiaoqing]
					age [24]
					age1 [23] */
	}

	//得到查询片段信息
	fmt.Println(u.Fragment) // output: 	fffffff

	生成参数形如:name=xiaoming&name=xiaoqing&age=24&age1=23
	v := url.Values{}
	//添加一个k-v值
	v.Set("name", "xiaoming")
	v.Add("name", "xiaoqing")
	v.Set("Age", "23")
	fmt.Println(v)  // output: map[name:[xiaoming xiaoqing] Age:[23]]
	fmt.Println(v.Get("name"))  // output: xiaoming
	v.Del("name")
	fmt.Println(v)  // output: map[Age:[23]]
	//把map编码成name=xiaoming&name=xiaoqing&age=24&age1=23的形式
	v.Set("name", "xiaoming")
	v.Add("name", "xiaoqing")
	fmt.Println(v.Encode())  // output: Age=23&name=xiaoming&name=xiaoqing
}

你可能感兴趣的:(Go,url,go)