美文网首页
golang url 链接地址解析包

golang url 链接地址解析包

作者: copyLeft | 来源:发表于2019-06-07 03:53 被阅读0次

    golang url 链接地址解析包

    url 编码

    • QueryEscape 将字符地址转为安全地址

      func QueryEscape(s string) string
      
      p := url.QueryEscape("/user?id=12")
      // >>> %2Fuser%3Fid%3D12
      
    • QueryUnescape 还原QueryEscape 转码

      func QueryUnescape(s string) (string, error)
      

    URL 类型

    • URL 结构

      type URL struct {
          Scheme   string
          Opaque   string    // 编码后的不透明数据
          User     *Userinfo // 用户名和密码信息
          Host     string    // host或host:port
          Path     string
          RawQuery string // 编码后的查询字符串,没有'?'
          Fragment string // 引用的片段(文档位置),没有'#'
      }
      
    • url 解析格式

      // 双斜杠地址
      scheme://[userinfo@]host/path[?query][#fragment]
      
      // 非双斜杠地址
      scheme:opaque[?query][#fragment]
      
      compelePath := "http://lcoalhost:8080/user?id=1"
        subPath := "/user?id=1"
        
        // 双斜杠
        cP, _ := url.Parse(compelePath)
        _log(cP.Host)
        // >>> lcoalhost:8080
        
        // 非双斜杠
        sP, _ := url.Parse(subPath)
        _log(sP.Host)
        _log(sP.RawQuery)
        // >>>   (空值)
        // >>> id=1
      
        // 两者可获取的参数不同
      

    URL 解析

    • Parse 将字符解析为URL对象

      func Parse(rawurl string) (url *URL, err error)
      
    • ParseRequestURI 解析从http请求中获取的 url地址,该地址将不包含[#fragment] 后缀

      func ParseRequestURI(rawurl string) (url *URL, err error)
      

    URL 操作方法

    • func IsAbs 是否为绝对地址

      func (u *URL) IsAbs() bool
      
        compelePath := "http://lcoalhost:8080/user?id=1"
        subPath := "/user?id=1"
      
        cP, _ := url.Parse(compelePath)
        _log(cP.IsAbs())
        // >>> true 
      
        sP, _ := url.Parse(subPath)
        _log(sP.IsAbs())
        // >>> false
      
    • func Query 获取查询参数

      func (u *URL) Query() Values
      
      URL, _ := url.Parse("/user?nickname=coco")
      args := URL.Query()
      // >>> map[nickname:["coco"]]
      
    • func RequeryURI 获取URL编码后的参数字符

      u := url.URL{
            Host:     "lcoalhost:8080",
            Path:     "/user",
            RawQuery: "nickname=coco&age=24",
        }
      
        queryStr := u.RequestURI()
        // >>> /user?nickname=coco&age=24
        
      
    • func String 获取完整的地址字符

      func (u *URL) String() string
      
      u := url.URL{
            Scheme:   "http",
            Host:     "lcoalhost:8080",
            Path:     "/user",
            RawQuery: "nickname=coco&age=24",
        }
      _log(u.String())
      // >>> http://lcoalhost:8080/user?nickname=coco&age=24
      
    • func Parse 以当前URL为上下文解析新地址

      func (u *URL) Parse(ref string) (*URL, error)
      
      u := url.URL{
            Scheme:   "http",
            Host:     "lcoalhost:8080",
            Path:     "/user",
            RawQuery: "nickname=coco&age=24",
        }
      newUrl, _ := u.Parse("/login")
      // >>> http://lcoalhost:8080/login
      

    URL 用户结构方法

    • User 使用用户名创建用户信息结构

      func User(username string) *Userinfo
      
    • UserPassword 使用用户密码创建用户信息结构

       func UserPassword(username, password string) *Userinfo
      
    • func Username 获取用户名称

      func (u *Userinfo) Username() string
      
    • func Password 是否设置密码

      func (u *Userinfo) Password() (string, bool)
      
    • func String 返回用户信息

      func (u *Userinfo) String() string
      

    参数对象 Values

    • Values 结构

      type Values map[string][]string
      
    • ParseQuery 参数解析

      func ParseQuery(query string) (m Values, err error)
      
      args, _ := url.ParseQuery("name=coco&age=24")
      // >>> map[age:[24], name:[coco]]
      
      prefixArgs, _ := url.ParseQuery("/user?name=coco")
      // >>> map[/user?name:[coco]]
      
      // 需要注意这里解析的字符不包含地址的其他部分, [key]=[value]
      
    • func Get 获取指定参数集合的第一个值

      func (v Values) Get(key string) string
      
        args, _ := url.ParseQuery("name=coco&age=24")
        // 添加新元素
        args.Add("name", "jeck")
        _log(args.Get("name"))
        // >>> coco
      
    • func Set 设置参数

      func (v Values) Set(key, value string)
      
        args, _ := url.ParseQuery("name=coco&age=24")
        args.Add("name", "jeck")
        args.Set("name", "Rogan")
        // >>> map[age:[24] name:[Rogan]]
      
    • func Add 添加参数

      func (v Values) Add(key, value string)
      
    • func Del 删除参数

      func (v Values) Del(key string)
      
    • func Encode 转字符串

      func (v Values) Encode() string
      
      args := url.Values{
            "name": []string{"coco"},
            "age":  []string{"34"},
        }
      
      queryStr := args.Encode()
      // >>> age=34&name=coco
      

    总结

    • URL 包提供的是对 url 的解析及构建方法
    • 按照类型分: URL, Userinfo, Values
    • 按照方法分:
      • 类构件[ 将字符地址解析为对应类型 , url.ParseQuery ]
      • 查询[从解析后的对象获取数据, URL.Query]
      • 操作[ 修改对象信息, Values.Set ]
    • 服务端使用 解析较多 例如: url.Parse URL.Query ....
    • 客户端, 爬虫 以构建查询为主 例如: Values.Get Values.Encode ....

    相关文章

      网友评论

          本文标题:golang url 链接地址解析包

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