Golang URL 实例解析

net/url package 与url相关的标准库
Package url parses URLs and implements query escaping
package main
import (
    "fmt"
    "net/url"
    "strings"
)
func main() {
    Url := "https://username:password@www.domain.com:9999/login?name=9527&name=9527&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)
    }
    //得到Scheme
    fmt.Println(u.Scheme)//https
    //User 包含认证信息 username and password
    user := u.User
    fmt.Println(user)//username:password
    username := user.Username()
    fmt.Println(username)//username
    password, b := user.Password()
    fmt.Println(password, b)//password true
    //Host 包括主机名和端口信息
    host := u.Host
    fmt.Println(host)//www.domain.com:9999
    ho := strings.Split(host, ":")//从Host提取端口
    fmt.Println("主机名:", ho[0])//主机名: www.domain.com
    fmt.Println("端口号:", ho[1])//端口号: 9999   
    path := u.Path//获取path
    fmt.Println(path)// /login
    //获取参数 将查询参数解析为一个map map以查询字符串为键 对应值字符串切片为值。
    fmt.Println(u.RawQuery)// name=9527&name=9527&age=24&age1=23
    urlParam := u.RawQuery
    fmt.Println("urlParam:", urlParam)//urlParam: name=9527&name=9527&age=24&age1=23
    m, err := url.ParseQuery(urlParam)
    if err == nil {
        fmt.Println(m)//map[age:[24] age1:[23] name:[9527 9527]]
        for k, v := range m {
            fmt.Println(k, v)//name [9527 9527] age [24] age1 [23]
        }
    }
    //与 ParseQuery 一样 只是将上边的方法分装了
    m1 := u.Query()
    fmt.Println(m1) // map[age:[24] age1:[23] name:[9527 9527]]
    for k, v := range m1 {
        fmt.Println(k, v)//name [9527 9527] age [24] age1 [23]
    }
    //查询片段信息
    fmt.Println(u.Fragment) //fffffff
    //生成参数 name=9527&name=9527&age=24&age1=23
    v := url.Values{}
    //添加一个k-v值
    v.Set("name", "9527")
    v.Add("name", "9527")
    v.Set("Age", "23")
    fmt.Println(v)//map[Age:[23] name:[9527 9527]]
    fmt.Println(v.Get("name"))//9527
    v.Del("name")
    fmt.Println(v) //map[Age:[23]]
    //把map编码成name=9527&name=9527&age=24&age1=23的形式
    v.Set("name", "9527")
    v.Add("name", "9527")
    fmt.Println(v.Encode()) //Age=23&name=9527&name=9527
}//ParseRequestURI 解析Url为一个URL结构体 本函数会假设Url是在一个HTTP请求里
u1, err := url.ParseRequestURI(Url)
if err == nil {
fmt.Println(u1)
}

ParseRequestURI

//会假设该参数是一个绝对URL或者绝对路径 并会假设该URL没有#fragment后缀
func ParseRequestURI(rawurl string) (url *URL, err error)
ParseRequestURI 解析 rawurl 为一个URL结构体
本函数会假设 rawurl 是在一个HTTP请求里 因此会假设该参数是一个绝对URL或者绝对路径
并会假设该URL没有#fragment后缀 网页浏览器会在去掉该后缀后才将网址发送到网页服务器
package main
import (
    "fmt"
    "net/url"
)
func main() {
    Url := "https://username:password@www.domain.com:9999/login?name=9527&name=9527&age=24#fffffff"
    values, err := url.ParseRequestURI(Url)
    fmt.Println(values)//https://username:password@www.domain.com:9999/login?name=9527&name=9527&age=24#fffffff
    if err != nil {
            fmt.Println(err)
    }
    urlParam := values.RawQuery
    fmt.Println(urlParam)//name=9527&name=9527&age=24&age1=23#fffffff
}