net/url

作者: 酷走天涯 | 来源:发表于2018-12-25 09:27 被阅读8次

    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())
    }
    

    相关文章

      网友评论

          本文标题:net/url

          本文链接:https://www.haomeiwen.com/subject/qwivoftx.html