url包解析URL的重要工具,我们研究一下里面的具体功能
- 1.URL 介绍
- 2.查询条件进行转码,可以安全的使用在URL查询
- 3.将QueryEscape转码的字符串还原
- 4.将url字符串,解析为请求需要的字符格式
- 5.获取编码好的请求资源路径URI
- 6.检查请求是否为绝度路径URL
- 7.查询条件的操作
1.URL 介绍
URL基本格式如下
scheme://[userinfo@]host/path[?query][#fragment]
scheme: 协议 http(s),ws(s),ftp等
[userinfo@]:用户信息
host:主机地址
path:资源路径
query:查询条件
fragment:引用的片段(文档位置)
go中的URL 结构
type URL struct {
Scheme string
Opaque string // 编码后的不透明数据
User *Userinfo // 用户名和密码信息
Host string // host或host:port
Path string
RawQuery string // 编码后的查询字符串,没有'?'
Fragment string // 引用的片段(文档位置),没有'#'
}
下面我们演示如何将一个字符串url解析成标准的URL 结构体
func main() {
u, err := url.Parse("http://bing.com/search?q=dotnet")
if err != nil {
log.Fatal()
}
fmt.Println(u.Scheme) //http
fmt.Println(u.Host) //bing.com
fmt.Println(u.Path) //search
fmt.Println(u.Query()) //map[q:[dotnet]]
fmt.Println(u.User) // nil
fmt.Println(u.RawQuery) // q=dotnet
fmt.Println(u.Fragment) //nil
fmt.Println(u.Opaque) // nil
fmt.Println(u.Hostname()) // search
fmt.Println(u.EscapedPath()) //search 安全路径 search= 它会解析为 search%3D
fmt.Println(u.IsAbs()) // true
fmt.Println(u.Port()) //nil
fmt.Println(u.RawPath) //nil
}
这里需要注意一下 u.Path 字段,如果你的连接为 http://bing.com/%47%6f%2f?q=dotnet,那么保存的路径不是/%47%6f%2f 而是/G0/,因为路径是以解码后的字段保存的
问题来了 如果有两个路径 http://bing.com/%47%6f%2f?q=dotnet
和 http://bing.com/Go/?q=dotnet
u.RawPath
2.查询条件进行转码
func main() {
fmt.Println(url.QueryEscape("name=124&sex=123"))
}
name%3D124%26sex%3D123
3.将QueryEscape转码的字符串还原
func main() {
fmt.Println(url.QueryUnescape("name%3D124%26sex%3D123"))
}
name=124&sex=123 <nil>
4.将url字符串,解析为请求需要的字符格式
ParseRequestURI函数解析rawurl为一个URL结构体,本函数会假设rawurl是在一个HTTP请求里,因此会假设该参数是一个绝对URL或者绝对路径,并会假设该URL没有#fragment后缀。(网页浏览器会在去掉该后缀后才将网址发送到网页服务器)
u, err := url.ParseRequestURI("http://bing.com/search?q=dotnet#name")
if err != nil {
log.Fatal()
}
fmt.Println(u.String())
image.png
5.获取编码好的请求字符串
func main() {
u, err := url.Parse("https://baidu.com/search?q=dotnet#name")
if err != nil {
log.Fatal()
}
fmt.Println(u.RequestURI())
}
image.png
6.检查请求是否为绝度url
u, err := url.Parse("/images/01.gif?q=dotnet#name")
if err != nil {
log.Fatal()
}
fmt.Println(u.IsAbs()) // false
7.查询条件的操作
scheme://[userinfo@]host/path[?query][#fragment]
主要针对query 的一些操作
func main() {
v := url.Values{}
v.Set("name", "Ava")
v.Add("friend", "Jess")
v.Add("friend", "Sarah")
v.Add("friend", "Zoe")
fmt.Println(v.Get("name"))
fmt.Println(v.Encode())
v.Del("name")
fmt.Println(v.Encode())
}
网友评论