go语言解析URL,获取Scheme、Path、Query、Fragment等

用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
}

参考

http://doc.golang.ltd/pkg/net_url.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙在山东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值