go语言的urlencode编码使用方式
2016-06-12 18:17
351 查看
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进行编码。
相关文章推荐
- GoogleMaps踏坑之旅(三)
- django学习之旅 - 基础命令讲解
- Sugon I840-G20安装windows系统
- 用Golang实现基于时间轮算法的定时器
- Mongo expireAfterSeconds 时间设置
- Dashgo D1蓝牙控制移动
- 如何更换Odoo 8的LOGO
- Django中文显示
- poj 1179 Polygon(化环为直+区间dp)
- jump Consistent hash:零内存消耗,均匀,快速,简洁,来自Google的一致性哈希算法
- where are you going ? 反序为:going you are where
- mac go sublime 3
- beego curd 操作遇到的坑
- 使用Google Volley及遇到的坑
- Golang 环境的安装
- django主键的使用
- Django session机制
- Algorithm: 移动盒子
- go text/templete模板
- 关于Goroutine的原理