用go标准库net/url解析url,可以获取url的各种信息,这些信息大都在URL结构体里:
type URL struct {
Scheme string
Opaque string // encoded opaque data
User *Userinfo // username and password information
Host string // host or host:port
Path string // path (relative paths may omit leading slash)
RawPath string // encoded path hint (see EscapedPath method)
OmitHost bool // do not emit empty host (authority)
ForceQuery bool // append a query ('?') even if RawQuery is empty
RawQuery string // encoded query values, without '?'
Fragment string // fragment for references, without '#'
RawFragment string // encoded fragment hint (see EscapedFragment method)
}
下面实例代码用来获取这些信息:
package main
import (
"fmt"
"net/url"
"strings"
)
func main() {
Url := "https://user:password@www.example.com:8080/login?name=xiaoming&name=xiaoqing&age=24&age1=23#fffffff"
u, err := url.Parse(Url)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%T\n\r", u) // 返回类型是URL
fmt.Println(u.Scheme) // 协议:https
user := u.User
fmt.Println(user) // Userinfo类型:user:password
username := user.Username()
fmt.Println(username) // 用户名:user
password, b := user.Password()
fmt.Println(password, b) // 密码:password 是否设置:true
host := u.Host
fmt.Println(host) // 字符串类型的主机:www.example.com:8080
ho := strings.Split(host, ":")
fmt.Println("主机名:", ho[0])
fmt.Println("端口号:", ho[1])
//获取path
path := u.Path // 字符串类型Path路径:/login
fmt.Println(path)
// 编码query值,不带?
urlParam := u.RawQuery
fmt.Println("urlParam:", urlParam)
// 解析query值
m, err := url.ParseQuery(urlParam)
if err == nil {
fmt.Println(m)
for k, v := range m {
fmt.Println(k, v)
}
}
// 解析后的query字典
m1 := u.Query()
fmt.Println(m1)
for k, v := range m1 {
fmt.Println(k, v)
}
// 片段,不带#
fmt.Println(u.Fragment)
// 生成参数形如: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
}