go语言的urlencode编码使用方式

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进行编码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值