net/url

时间:2022-06-22
本文章向大家介绍net/url,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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=dotnethttp://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())
}