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
}
尊贵的董事大人
英文标题不为空时 视为本栏投稿
需要关键字 描述 英文标题