golang url 链接地址解析包

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 ....
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容