go语言的urlencode编码使用方式

guoer9973 · · 1057 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

1,首先我们可以查看godoc.com下的net/url

https://godoc.org/net/url

2,我们来看下演示代码

package main

import (
    "crypto/md5"
    "flag"
    "fmt"
    "net/url"
    "strings"
    "time"
)

func main() {
    fmt.Println("./timetoken -t 3600 -key key  -url url")

    var t int64
    var key string
    var resUrl string
    flag.Int64Var(&t, "t", 0, "expire timestamp")
    flag.StringVar(&key, "key", "", "encrypt key")
    flag.StringVar(&resUrl, "url", "", "resource url")
    flag.Parse()

    if t == 0 || key == "" || resUrl == "" {
        return
    }

    expireTime := fmt.Sprintf("%x", time.Now().Unix()+t)

    resUri, pErr := url.Parse(resUrl)
    if pErr != nil {
        return
    }
    fmt.Println(resUri)
    path := resUri.EscapedPath()
    fmt.Println(path)
    rawStr := fmt.Sprintf("%s%s%s", key, path, expireTime)
    fmt.Println(rawStr)
    md5H := md5.New()
    md5H.Write([]byte(rawStr))

    sign := fmt.Sprintf("%x", md5H.Sum(nil))
    //sign := hex.EncodeToString(md5H.Sum(nil))

    var newUrl string
    if strings.Contains(resUrl, "?") {
        newUrl = fmt.Sprintf("%s&sign=%s&t=%s", resUrl, sign, expireTime)
    } else {
        newUrl = fmt.Sprintf("%s?sign=%s&t=%s", resUrl, sign, expireTime)
    }

    fmt.Println(newUrl)
}

3,接着上面的代码,我们来分析下urlencode

1,我们看到的一个方法就是func (Values) Encode这个方法,但是它需要对Values类型的变量提供编码服务。返回Values的方法有func (u *URL) Query() Values。这条走不通,因为我要对path进行编码

2,然后我看了func (Values) Encode方法的源码,发现里面编码用的func QueryEscape(s string) string这个方法,但是这个方法,还是不能满足对url的编码服务,因为对“/“没有做特殊处理

3,其实使用很简单,当你url.parse的时候已经编码,但是你要取path的时候,会转换回来,所以导致处理失败。

4,最终采用了url.EscapedPath()这个方法,它可以直接对path进行编码。


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:guoer9973

查看原文:go语言的urlencode编码使用方式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1057 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传