go语言的urlencode编码使用方式

来源:互联网 发布:java统计在线用户 编辑:程序博客网 时间:2024/05/29 03:12

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

https://godoc.org/net/url

2,我们来看下演示代码

package mainimport (    "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进行编码。

0 0
原创粉丝点击